转载请注明出处哈: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. 根据自身系统的对象类型做处理.

BigMemroy系列文章--11. BigMemory中的SizeOf问题相关推荐

  1. Oracle APEX 系列文章11:全站启用 HTTPS,让你的 APEX 更安全

    引言 目前主流的网站都要求 HTTPS 安全访问,Google Chrome 浏览器.微信内置浏览器打开非 HTTPS 的网页,都会提示不安全.如果做微信端开发,也是必须要 HTTPS 的网址才可以, ...

  2. 将输出结果以json类型打印在控制台上_系列文章:Kubernetes中日志的正确输出姿势...

    前言 上一期主要和大家介绍从全局维度考虑如何去构建K8s中的日志系统,本期我们从实践角度出发来一步步构建K8s中的日志监控体系.构建日志系统的第一步是如何去产生这些日志,而这也往往是最繁杂最困难的一步 ...

  3. Flowable入门系列文章11 - Flowable API 01

    1.Process Engine API和服务 引擎API是与Flowable进行交互的最常见的方式.主要的出发点是ProcessEngine,可以按照配置部分所述的几种方式创建 .从 Process ...

  4. Carlosfu技术系列文章总目录

    转载请注明出处哈:http://carlosfu.iteye.com/blog/2240426   刚看了一下这个账号是2009年注册的,当时可能是为了下载javaeye的周刊吧,后来12年开始工作时 ...

  5. Oracle APEX 系列文章15:无人值守一键安装Oracle APEX环境

    本文是钢哥的 Oracle APEX 系列文章的第15篇,完整文章目录如下: Oracle APEX 系列文章01:Oracle APEX, 让你秒变全栈开发的黑科技 Oracle APEX 系列文章 ...

  6. Python编程思想【系列文章】

    <Python编程思想>专栏 本系列文章持续更新中....... 李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及P ...

  7. Oracle APEX 系列文章14:Oracle APEX 18.1 Docker 镜像

    本文是钢哥的 Oracle APEX 系列文章的第14篇,完整文章目录如下: - Oracle APEX 系列文章01:Oracle APEX, 让你秒变全栈开发的黑科技 - Oracle APEX ...

  8. 【HTML 教程系列第 11 篇】HTML 中常用的文本格式化标签

    这是[HTML 教程系列第 11 篇],如果觉得有用的话,欢迎关注专栏. 在网页中,有时需要为文字设置粗体.斜体.下划线或上下标等效果,这时就需要用到 HTML 中的文本格式化标签(也叫文本标签),常 ...

  9. 大话卫星导航中的信号处理系列文章——全球卫星导航系统介绍

    大话卫星导航中的信号处理系列文章--全球卫星导航系统介绍 前言 全球导航系统介绍 GPS的发展规划 Glonass的发展规划 Galileo的发展规划 Beidou系统(BDS) IRNSS系统的发展 ...

最新文章

  1. [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
  2. CentOS 7 搭建JAVA环境
  3. 巧用“傍术”选择陈列点
  4. spring mvc4 html访问,Spring 页面重定向例子
  5. c语言 运行库 下载,Visual C++运行库合集
  6. 计算机网络原理(04741)第1章:计算机网络概述
  7. Python实现人机中国象棋游戏
  8. python数学符号读法大全_数学符号及读法大全
  9. 图扑软件数字孪生微电网,部署源网荷储一体化平台事半功倍
  10. Python获取对象所占内存大小方法
  11. 系统全面讲解word中选择性粘贴命令
  12. 重装系统后Win10无故关机解决
  13. pandas使用read_csv函数读取文件的前N行数据并保留表头、pandas使用read_csv函数读取制表符分割的文件(tab-delimited)、自定义设置sep参数
  14. 谷歌邮箱服务器验证失败,Gmail错误:SMTP服务器需要安全连接,或者客户端未经身份验证。服务器响应为...
  15. Android 双击退出和单击回到桌面
  16. 法国蓬皮杜中心天猫官方旗舰店开业;洲际集团旗下高端品牌voco全球开业及签约酒店数突破100家 | 美通企业日报...
  17. luckysheet 只读模式和编辑模式
  18. 矩阵初等变换的“打洞技巧”与“分块矩阵的行列式公式”
  19. 前端基础:HTTP强制缓存
  20. DSP PWM 模块原理及使用

热门文章

  1. ASP超级链接和HTML函数正则表达式 修正版
  2. SVG Authoring Guidelines[转]
  3. 12306订票候补是个坑_加30元就能抢到火车票?12306这个功能更靠谱!今起可买除夕火车票,抢票高峰来了...
  4. Windows核心编程 第六章 线程基础知识 (下)
  5. hdu5251最小矩形覆盖
  6. POJ2349二分+并查集,类似最小树的贪心
  7. C语言经典例84-一个偶数总能表示为两个素数之和
  8. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
  9. 【Groovy】闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )
  10. 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )