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

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;-- ...

    PC-Lint选项详解.

    PC-Lint是一款广泛应用于C/C++语言的源代码静态分析工具,它能够检测代码中的错误、潜在问题以及风格上的不一致之处。开发者通过使用PCLint的选项,可以精细控制检查过程,从而让代码检查更加贴近实际项目的需求。...

    get-driver-serial.rar_visual c

    在IT行业中,编程是一项至关重要的技能,而Visual C++作为微软公司推出的面向对象的C++集成开发环境,被广泛用于创建高性能的应用程序。本话题主要围绕"get-driver-serial.rar"这个压缩包文件,它涉及到如何使用...

    [深入理解计算机系统].(课后答案)Computer.Systems.-.A.Programmers.Perspective.-.Randal.Bryant,.David.O.Hallaron.-.1008.pages.High.Quality.-.2003.Prentice.Hall.djvu

    这一系列练习主要考察学生对位操作的理解和应用能力。具体解答略。 通过以上解析可以看出,《深入理解计算机系统》这本书不仅提供了丰富的理论知识,还配以大量的习题来加深读者对计算机系统工作原理的理解。这对于...

    111、第1课 加法天才(add)--2020.03.27a.pdf

    在标准数学计算中,整数是有一定范围限制的。例如,在C++中,`int`类型通常只能存储-2^31到2^31-1之间的整数。当需要进行超出这一范围的大整数运算时,就需要采取特殊的方法来实现。 #### 实现思路 - **字符串处理*...

    Tree-10-13.rar_site:www.pudn.com

    在IT领域,树数据结构是一种极其重要的非线性数据结构,它在计算机科学中的应用广泛,包括文件系统、数据库索引、编译器语法分析、图形处理等。在这个"Tree-10-13.rar"压缩包中,我们找到了与C语言实现树结构相关的...

    common-22.7.0.zip

    在这个名为"common-22.7.0.zip"的压缩包中,包含了一个名为"sizeof-master"的子目录,这可能是一个关于`sizeof`引擎的源代码库,特别是针对`ehcacheconfigurable sizeof`引擎的实现。 `sizeof`引擎是`ehcache`的一...

    SPT-02-顺序表2.pdf

    在本实验中,我们将探讨如何使用动态分配顺序存储结构实现线性表的基本操作,与之前定长顺序存储结构相比,动态分配方式提供了更大的灵活性。线性表是一种基础的数据结构,它包含一组按照特定顺序排列的元素。在这个...

    Jump-too-much-of-a-line.rar_Too Much

    在C++编程中,有时我们需要处理文本文件时,可能需要忽略文件的开头部分,比如第一行,然后从第二行开始读取数据。标题"Jump-too-much-of-a-line.rar_Too Much"暗示了这个场景,描述中也明确指出我们要跳过文件的第...

    数据结构--队列实验报告.docx

    链队列中的每个元素都是链表中的一个节点,队列的前端和后端分别对应链表的头部和尾部。与顺序队列相比,链队列的优点在于无需预先分配固定大小的空间,可以动态地增加或减少队列中的元素数量。 #### 操作流程 - **...

    docobject-c面试题.doc

    从给定的文件信息中,我们可以提取到一系列与Objective-C编程相关的知识点,涵盖了从基本语法、数据类型到高级概念如内存管理、设计模式等。以下是这些知识点的详细解析: ### 1. 指针与数组操作 在Objective-C中...

    java-sizeof-0.0.4:一个查看java对象占用内存大小

    本文将深入探讨Java中的对象内存占用,以及如何使用"java-sizeof-0.0.4"工具来查看Java对象在内存中的大小。 在Java中,内存主要分为堆内存(Heap)和栈内存(Stack)。对象通常存储在堆内存中,而基本类型的变量和...

    the-use-of-CStdiofile.rar_CStdioFile

    在C++编程中,`CStdioFile`是MFC(Microsoft Foundation Classes)库提供的一种文件操作类,它封装了标准C库中的`stdio.h`,使得我们可以方便地使用面向对象的方式来处理文件输入输出。本篇文章将深入探讨`...

    计算机软件-商业源码-实例076-模拟键盘操作.zip

    在IT行业中,模拟键盘操作是一种常见的技术,尤其在自动化测试、脚本编程或者游戏辅助等领域应用广泛。这个“计算机软件-商业源码-实例076-模拟键盘操作.zip”文件提供了一个关于如何在程序中模拟键盘输入的实例。...

    系统键盘相关介绍及windows API的整理--刘男亚.docx

    句柄本身并不包含窗口的信息,而是作为一个索引值指向内存中的数据结构,这些数据结构包含了窗口的所有信息。 #### 2. 获取句柄的方法 在Windows下,有多种方法可以获取到窗口的句柄: - **通过窗口类名和窗口...

    顺序表的基本操作--插入-删除-合并.doc

    在本实验中,我们主要探讨了顺序表的基本操作,包括创建、插入、删除以及有序表的合并。顺序表是一种常见的线性数据结构,它将所有元素存储在一个连续的内存空间中,具有简单高效的特性。 首先,我们需要理解顺序表...

Global site tag (gtag.js) - Google Analytics