转载请注明出处哈:http://carlosfu.iteye.com/blog/2237511
感谢博主:hot66hot.iteye.com/
一:BigMemory如何使用DirectMemory内存
以下是bigMemory启动时打印的DirectMemory分区概述:
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警告如下,
为了减少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. 根据自身系统的对象类型做处理.
相关推荐
赠送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-...
赠送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-...
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...
SIZEOF 02 RTTI 02 SHAPE 02 ...... TEMFUNC 02 FRAME7 03 ...... SCRIBBLE step0 <DIR> <-- Chapter 07 step1 <DIR> <-- Chapter 08 ...... step5 <DIR> <-- Chapter 12 ...... TRACEWIN <DIR> <-- ...
PC-Lint是一款广泛应用于C/C++语言的源代码静态分析工具,它能够检测代码中的错误、潜在问题以及风格上的不一致之处。开发者通过使用PCLint的选项,可以精细控制检查过程,从而让代码检查更加贴近实际项目的需求。...
在IT行业中,编程是一项至关重要的技能,而Visual C++作为微软公司推出的面向对象的C++集成开发环境,被广泛用于创建高性能的应用程序。本话题主要围绕"get-driver-serial.rar"这个压缩包文件,它涉及到如何使用...
这一系列练习主要考察学生对位操作的理解和应用能力。具体解答略。 通过以上解析可以看出,《深入理解计算机系统》这本书不仅提供了丰富的理论知识,还配以大量的习题来加深读者对计算机系统工作原理的理解。这对于...
在标准数学计算中,整数是有一定范围限制的。例如,在C++中,`int`类型通常只能存储-2^31到2^31-1之间的整数。当需要进行超出这一范围的大整数运算时,就需要采取特殊的方法来实现。 #### 实现思路 - **字符串处理*...
在IT领域,树数据结构是一种极其重要的非线性数据结构,它在计算机科学中的应用广泛,包括文件系统、数据库索引、编译器语法分析、图形处理等。在这个"Tree-10-13.rar"压缩包中,我们找到了与C语言实现树结构相关的...
在这个名为"common-22.7.0.zip"的压缩包中,包含了一个名为"sizeof-master"的子目录,这可能是一个关于`sizeof`引擎的源代码库,特别是针对`ehcacheconfigurable sizeof`引擎的实现。 `sizeof`引擎是`ehcache`的一...
在本实验中,我们将探讨如何使用动态分配顺序存储结构实现线性表的基本操作,与之前定长顺序存储结构相比,动态分配方式提供了更大的灵活性。线性表是一种基础的数据结构,它包含一组按照特定顺序排列的元素。在这个...
在C++编程中,有时我们需要处理文本文件时,可能需要忽略文件的开头部分,比如第一行,然后从第二行开始读取数据。标题"Jump-too-much-of-a-line.rar_Too Much"暗示了这个场景,描述中也明确指出我们要跳过文件的第...
链队列中的每个元素都是链表中的一个节点,队列的前端和后端分别对应链表的头部和尾部。与顺序队列相比,链队列的优点在于无需预先分配固定大小的空间,可以动态地增加或减少队列中的元素数量。 #### 操作流程 - **...
从给定的文件信息中,我们可以提取到一系列与Objective-C编程相关的知识点,涵盖了从基本语法、数据类型到高级概念如内存管理、设计模式等。以下是这些知识点的详细解析: ### 1. 指针与数组操作 在Objective-C中...
本文将深入探讨Java中的对象内存占用,以及如何使用"java-sizeof-0.0.4"工具来查看Java对象在内存中的大小。 在Java中,内存主要分为堆内存(Heap)和栈内存(Stack)。对象通常存储在堆内存中,而基本类型的变量和...
在C++编程中,`CStdioFile`是MFC(Microsoft Foundation Classes)库提供的一种文件操作类,它封装了标准C库中的`stdio.h`,使得我们可以方便地使用面向对象的方式来处理文件输入输出。本篇文章将深入探讨`...
在IT行业中,模拟键盘操作是一种常见的技术,尤其在自动化测试、脚本编程或者游戏辅助等领域应用广泛。这个“计算机软件-商业源码-实例076-模拟键盘操作.zip”文件提供了一个关于如何在程序中模拟键盘输入的实例。...
句柄本身并不包含窗口的信息,而是作为一个索引值指向内存中的数据结构,这些数据结构包含了窗口的所有信息。 #### 2. 获取句柄的方法 在Windows下,有多种方法可以获取到窗口的句柄: - **通过窗口类名和窗口...
int n = sizeof(arr) / sizeof(arr[0]); int target = 9; int index = binarySearch(arr, target, 0, n - 1); if (index != -1) cout 元素在数组中的索引为: " ; else cout 元素不在数组中" ; return 0; ...