BigMemroy系列文章--11. BigMemory中的SizeOf问题
转载请注明出处哈: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. 根据自身系统的对象类型做处理.
BigMemroy系列文章--11. BigMemory中的SizeOf问题相关推荐
- Oracle APEX 系列文章11:全站启用 HTTPS,让你的 APEX 更安全
引言 目前主流的网站都要求 HTTPS 安全访问,Google Chrome 浏览器.微信内置浏览器打开非 HTTPS 的网页,都会提示不安全.如果做微信端开发,也是必须要 HTTPS 的网址才可以, ...
- 将输出结果以json类型打印在控制台上_系列文章:Kubernetes中日志的正确输出姿势...
前言 上一期主要和大家介绍从全局维度考虑如何去构建K8s中的日志系统,本期我们从实践角度出发来一步步构建K8s中的日志监控体系.构建日志系统的第一步是如何去产生这些日志,而这也往往是最繁杂最困难的一步 ...
- Flowable入门系列文章11 - Flowable API 01
1.Process Engine API和服务 引擎API是与Flowable进行交互的最常见的方式.主要的出发点是ProcessEngine,可以按照配置部分所述的几种方式创建 .从 Process ...
- Carlosfu技术系列文章总目录
转载请注明出处哈:http://carlosfu.iteye.com/blog/2240426 刚看了一下这个账号是2009年注册的,当时可能是为了下载javaeye的周刊吧,后来12年开始工作时 ...
- Oracle APEX 系列文章15:无人值守一键安装Oracle APEX环境
本文是钢哥的 Oracle APEX 系列文章的第15篇,完整文章目录如下: Oracle APEX 系列文章01:Oracle APEX, 让你秒变全栈开发的黑科技 Oracle APEX 系列文章 ...
- Python编程思想【系列文章】
<Python编程思想>专栏 本系列文章持续更新中....... 李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及P ...
- Oracle APEX 系列文章14:Oracle APEX 18.1 Docker 镜像
本文是钢哥的 Oracle APEX 系列文章的第14篇,完整文章目录如下: - Oracle APEX 系列文章01:Oracle APEX, 让你秒变全栈开发的黑科技 - Oracle APEX ...
- 【HTML 教程系列第 11 篇】HTML 中常用的文本格式化标签
这是[HTML 教程系列第 11 篇],如果觉得有用的话,欢迎关注专栏. 在网页中,有时需要为文字设置粗体.斜体.下划线或上下标等效果,这时就需要用到 HTML 中的文本格式化标签(也叫文本标签),常 ...
- 大话卫星导航中的信号处理系列文章——全球卫星导航系统介绍
大话卫星导航中的信号处理系列文章--全球卫星导航系统介绍 前言 全球导航系统介绍 GPS的发展规划 Glonass的发展规划 Galileo的发展规划 Beidou系统(BDS) IRNSS系统的发展 ...
最新文章
- [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
- CentOS 7 搭建JAVA环境
- 巧用“傍术”选择陈列点
- spring mvc4 html访问,Spring 页面重定向例子
- c语言 运行库 下载,Visual C++运行库合集
- 计算机网络原理(04741)第1章:计算机网络概述
- Python实现人机中国象棋游戏
- python数学符号读法大全_数学符号及读法大全
- 图扑软件数字孪生微电网,部署源网荷储一体化平台事半功倍
- Python获取对象所占内存大小方法
- 系统全面讲解word中选择性粘贴命令
- 重装系统后Win10无故关机解决
- pandas使用read_csv函数读取文件的前N行数据并保留表头、pandas使用read_csv函数读取制表符分割的文件(tab-delimited)、自定义设置sep参数
- 谷歌邮箱服务器验证失败,Gmail错误:SMTP服务器需要安全连接,或者客户端未经身份验证。服务器响应为...
- Android 双击退出和单击回到桌面
- 法国蓬皮杜中心天猫官方旗舰店开业;洲际集团旗下高端品牌voco全球开业及签约酒店数突破100家 | 美通企业日报...
- luckysheet 只读模式和编辑模式
- 矩阵初等变换的“打洞技巧”与“分块矩阵的行列式公式”
- 前端基础:HTTP强制缓存
- DSP PWM 模块原理及使用
热门文章
- ASP超级链接和HTML函数正则表达式 修正版
- SVG Authoring Guidelines[转]
- 12306订票候补是个坑_加30元就能抢到火车票?12306这个功能更靠谱!今起可买除夕火车票,抢票高峰来了...
- Windows核心编程 第六章 线程基础知识 (下)
- hdu5251最小矩形覆盖
- POJ2349二分+并查集,类似最小树的贪心
- C语言经典例84-一个偶数总能表示为两个素数之和
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
- 【Groovy】闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )
- 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )