`
carlosfu
  • 浏览: 571677 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ba8b5055-9c58-3ab0-8a1c-e710f0495d2c
BigMemory实战与理...
浏览量:30003
53b2087e-c637-34d2-b61d-257846f73ade
RedisCluster开...
浏览量:149092
C9f66038-7478-3388-8086-d20c1f535495
缓存的使用与设计
浏览量:122690
社区版块
存档分类
最新评论

BigMemroy系列文章--11. BigMemory中的SizeOf问题

阅读更多

转载请注明出处哈:http://carlosfu.iteye.com/blog/2237511


 感谢博主:hot66hot.iteye.com/


 一:BigMemory如何使用DirectMemory内存

 

   以下是bigMemory启动时打印的DirectMemory分区概述:

Maximum Size (specified) : 32MB
Minimum Chunk Size : 8MB
Maximum Chunk Size : 32MB
Concurrency : 16
Initial Segment Table Size : 64 slots
Segment Data Page Size : 64KB

 

根据日志,可以猜测出BigMemory预先将数据空间划分为一系列Chunk,目的为了防止内存碎片化,与Memcache内存分配策略很像.

借用下memcache 的chunk空间分配过程图,可以更好的理解.

 

有个问题:bigMemory必须知道存储的对象所占用的空间,才能选择合适的chunk存放对象.

 

二:BigMemory计算对象所占空间

 

EHCache计算一个实例占用的内存大小。


基本思路:遍历实例数上的所有节点,对每个节点计算其占用的内存大小。

使用反射的方式计算一个实例占用的内存大小。

反射计算一个实例(instance)占用内存大小(size)过程如下: 
  a. 如果instance为null,size为0,直接返回。 
  b. 如果instance是数组类型,size为数组头部大小+每个数组元素占用大小* 数组长度+填充到对象对齐最小单位。 
  c. 如果instance是普通实例,size初始值为对象头部大小,然后找到对象对应类的所有继承类,从最顶层类开始遍历所有类,对每个类,纪录长整型和双精度型、整型和浮点型、短整型和字符型、布尔型和字节型以及引用类型的非静态字段的个数。在所有类计算完成后,按类对齐规则对齐等

参考资料:http://www.importnew.com/1305.html

 

EHCache中的SizeOf类中采用deepSize计算,它的步骤是:使用ObjectGraphWalker遍历一个实例的所有对象引用,在遍历中通过使用传入的SizeOfFilter过滤掉那些不需要的字段,然后调用传入的Visitor对每个需要计算的实例做计算。 
ObjectGraphWalker的实现算法使用了Stack,也可以使用Queue,这个影响遍历的顺序,深度优先还是广度优先的区别。它抽象了SizeOfFilter接口,可以用于过滤掉一些不想用于计算内存大小的字段,如Element中的key字段。SizeOfFilter提供了对类和字段的过滤:

public interface SizeOfFilter { 
// Returns the fields to walk and measure for a type 
Collection<Field> filterFields(Class<?> clazz, Collection<Field> fields); 
// Checks whether the type needs to be filtered 
boolean filterClass(Class<?> klazz); 
}

 

   SizeOfFilter的实现类可以用于过滤过滤掉@IgnoreSizeOf注解的字段和类,以及通过net.sf.ehcache.sizeof.filter系统变量定义的文件,读取其中的每一行为包名或字段名作为过滤条件。最后,为了性能考虑,它对一些计算结果做了缓存。 

结论: Bigmemory的主要开销:序列化+sizeOf计算

 

三:sizeOf引擎优化与测试:

 

1:对sizeOf引擎友好的对象:尽量使用不深/不广的对象:深(继承树) 广( bigPojo,ArrayList,HashMap等)

2:这边使用了大量的ArrayList和HashMap 等对象.日志给出bigMemory警告如下,

2014-04-09 17:30:54,376 [DubboServerHandler-10.10.34.12:20880-thread-248] WARN net.sf.ehcache.pool.impl.DefaultSizeOfEngine (DefaultSizeOfEngine.java:194) - The configured limit of 2,000 object references was reached while attempting to calculate the size of the object graph. This can be avoided by adding stop points with @IgnoreSizeOf annotations. Since the CacheManger or Cache <sizeOfPolicy> elements maxDepthExceededBehavior is set to "abort", the sizing operation has stopped and the reported cache size is not accurate. If performance degradation is NOT an issue at the configured limit, raise the limit value using the CacheManager or Cache <sizeOfPolicy> elements maxDepth attribute. For more information, see the Ehcache configuration documentation.

 

为了减少sizeOf计算开销,加入配置:计算超过2000次后终止,但这样会造成chunk分配混乱.

 

<sizeOfPolicy maxDepth="2000" maxDepthExceededBehavior="abort"/>

 

3:采用protostuff预前序列化的方式,bigMemory只存protostuff序列化后的byte数组

如下图:



 

 

 4:测试用例: 测试采用单线程压测100W次,directMemory空间为100MB.,对象实际值完全相同.



 


四、结论:
 

1. 采用预序列化(protostuff)之后set性能有3倍的提高,get性能提高50%以上。

2. 随着对象复杂度增加,相同空间预序列化(protostuff)方式占用空间更少,如HashMap的测试用例.

3. 但是如果对象是简单的pojo,则原生的bigMemory占用空间更有优势.

4. 根据自身系统的对象类型做处理.

  • 大小: 14.7 KB
  • 大小: 22 KB
  • 大小: 17.8 KB
分享到:
评论

相关推荐

    java-sizeof-0.0.5-API文档-中文版.zip

    赠送jar包:java-sizeof-0.0.5.jar; 赠送原API文档:java-sizeof-0.0.5-javadoc.jar; 赠送源代码:java-sizeof-0.0.5-sources.jar; 赠送Maven依赖信息文件:java-sizeof-0.0.5.pom; 包含翻译后的API文档:java-...

    java-sizeof-0.0.5-API文档-中英对照版.zip

    赠送jar包:java-sizeof-0.0.5.jar; 赠送原API文档:java-sizeof-0.0.5-javadoc.jar; 赠送源代码:java-sizeof-0.0.5-sources.jar; 赠送Maven依赖信息文件:java-sizeof-0.0.5.pom; 包含翻译后的API文档:java-...

    java-sizeof-0.0.5.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...

    深入浅出MFC完整源代码

    SIZEOF 02 RTTI 02 SHAPE 02 ...... TEMFUNC 02 FRAME7 03 ...... SCRIBBLE step0 &lt;DIR&gt; &lt;-- Chapter 07 step1 &lt;DIR&gt; &lt;-- Chapter 08 ...... step5 &lt;DIR&gt; &lt;-- Chapter 12 ...... TRACEWIN &lt;DIR&gt; &lt;-- ...

    c语言深度剖析

    1.5,最冤枉的关键字----sizeof....................... 1.5.1,常年被人误认为函数................... 1.5.2,sizeof(int)*p表示什么意思? 1.4,signed、unsigned关键字........................ 1.6,if、else...

    数据结构-程序填空题.doc

    p=(NODE *)malloc(sizeof(NODE)); head=p; q=p; p-&gt;next=NULL; for(i=1;i;i++) { p=(NODE *)malloc(sizeof(NODE)); (1)p-&gt;data=i ; (2)p-&gt;next=NULL ; (3)q-&gt;next=p ; (4) q=p ; } return(head); } 2.下列...

    数据结构-程序填空题.pdf

    p=(NODE *)malloc(sizeof(NODE)); head=p; q=p; p-&gt;next=NULL; for(i=1;i;i++) { p=(NODE *)malloc(sizeof(NODE)); (1)p-&gt;data=i ; (2)p-&gt;next=NULL ; (3)q-&gt;next=p ; (4) q=p ; } return(head); } 2.下列...

    common-22.7.0.zip

    sizeof.zip,sizeof引擎,从ehcacheconfigurable sizeof引擎中提取用于ehcache

    计算机基础程序设计--复习题.doc

    2A.do sizeof 5. 下列代码输出的结果是( ) int i=0;i=++i+8; Console.WriteLine(i++); A. 8 B. 9 C. 10 D. 11 6. 以下类型中,不属于值类型的是( ) A. 数值类型 B. 布尔类型 C.字符类型 D. 类类型 7. 设"int a=...

    实验2--栈实验报告.doc

    3、入栈函数程序如下: int Push(SqStack *S,ElemType e){ if(S-&gt;top-S-&gt;base&gt;=S-&gt;stacksize){ S-&gt;base=(ElemType *)realloc(S-&gt;base,(S-&gt;stacksize+STACKINCREMENT) *sizeof(ElemType)); if(!S-&gt;base) return ERROR...

    数据结构-银行排队问题.doc

    /* 某银行营业厅共有6个营业窗口,设有排队系统广播叫号,该银行的业务分为公积金、银 行卡、理财卡等三种。... W-&gt;head = (PeoNode *)malloc(sizeof(PeoNode)); if(W-&gt;head!=NULL) { W-&gt;head-&gt;next

    c++运算符优先级

    c++运算符优先级 优先级 操作符 描述 例子 结合性 1 () [] -&gt; . :: ++ -- 调节优先级的括号操作符 数组下标访问操作符 通过指向对象的指针访问成员的操作符 ...int size = sizeof(floatNum); 从右到左

    MFC源代码 SIZEOF.02

    MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 SIZEOF.02MFC源代码 ...

    视屏截图代码

    BITMAPINFO *pBInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize); pBInfo-&gt;bmiHeader.biBitCount = bitmap.bmBitsPixel; pBInfo-&gt;bmiHeader.biClrImportant = 0; pBInfo-&gt;bmiHeader....

    C语言深度解剖.zip

    1.1,最宽恒大量的关键字----auto..........................................................................................11 1.2,最快的关键字---- register.................................................

    C语言中的操作符优先级的详细介绍

    C语言中的操作符优先级的详细介绍 C语言中操作符的优先级大全, 当然c++, Objective-C,大部分语言都试用。 下面是来自The C Programming Language 2th的总结。 OperatorsAssociativity(结合性) 1. () [] -&gt; . ...

    c++ 面试题 总结

    11.下面代码有什么问题? Void test3(char* str1) { char string[10]; if(strlen(str1)) { strcpy(string, str1); } } ==数组越界 ==strcpy拷贝的结束标志是查找字符串中的\0 因此如果字符串中没有遇到...

    sizeof_xiang_jie.rar_sizeof

    详细解释sizeof,包含基本数据类型的,结构体的,以及联合体指针的sizeof

    java 通过sizeOf计算一个对象的大小

    NULL 博文链接:https://312256159-qq-com.iteye.com/blog/1582196

Global site tag (gtag.js) - Google Analytics