说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

优化技巧分享:把内存消耗降低至原来的1/20

HTML文档下载 WORD文档下载 PDF文档下载
Plumbr是一家Java存泄露检测器开发公司,在最近的客户报告中,他们发现了一个内存耗尽相关的问题。在检测后他们查出了问题所在,通过优化最终降低了21.5倍的堆内存。

这是最近发生的又一起内存相关的事件了。这个案例是从一个最近的客户报告中提取出来,一个异常运行的应用在其产品中反复报告内存耗尽。

这个症状是由我们的一个实验性功能发现,它主要用来监测某一类数据结构的使用情况。它提供了一个信号探针,结果会指向问题源代码的某一位置。为了保护客户的隐私,我们人为重建了该例子并保持它同原真实场景在技术层面的一致性。你可以免费在此处 下载到源码。

故事开始于一组从外界源加载进来的对象。同外部的信息交互是基于XML的接口,这本身并没什么大不了的,但事实上“基于XML的格式进行通讯”的实现细节被分散到了系统的每一个角落。 传入系统的文档是首先被转换成XMLBean实例,然后在整个系统范围内被使用,这中做法听起来有点傻。

整个问题中最核心的部分是一个延迟加载的缓冲方案。缓存的对象是“Person”的实例:

// Imports and methods removed to improve readability public class Person {     private String id;    private Date dateOfBirth;    private String forename;    private String surname;}

你也许会说这才能消耗多少内存呢。但当我们揭开进一步的细节时,发现事情就变了味了。表面上根据设计,声称实现只用到的诸如上文提到的那样一些简单的类,但真实的情形是使用了基于模型生成的数据结构。使用的模型是诸如下面的这个简化的XSD片段。

<xs:schema targetNamespace="http://plumbr.eu" xmlns:xs="http://www.w3.org/2001/XMLSchema"        elementFormDefault="qualified"> <xs:element name="person"> <xs:complexType>        <xs:sequence> <xs:element name="id" type="xs:string"/> <xs:element        name="dateOfBirth" type="xs:dateTime"/> <xs:element name="forename"        type="xs:string"/> <xs:element name="surname" type="xs:string"/>        </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

使用 XMLBeans,开发者生成了该模型,并在真实的场景中使用。现在我们回到开始的这个缓存的方案上来,假设它设计初衷是为了支持最多1.3M Person类的实例,而我们实际却要塞进去同等数量的大家伙,这从根上就注定了失败。

跑一组测试用例后,发现1.3M个基于XMLBean的生成的实例需要消耗大概1.5GB的堆空间。我们当时想这肯定可以做的更好。

第一个改进是显而易见的,外部同系统内部集成的实现细节是不应该把影响传递给系统的每一个角落的。所以我们把缓存改成了使用简单的  java.util.HashMap<Long, Person>。ID是键,Person是值。我们发现内存的消耗立即降低到了214MB。但这还不能令我们满意。

由于Map中的键是一个数,我们有十足的理由使用 Trove Collections来进一步降低它的内存消耗。这在实现上的改动很快,我们只需把  HashMap 改成  TLongObjectHashMap<Person> ,堆的消耗进一步降低到了143MB。

活干到这个程度我们已经可以收工了,但是工程师的好奇心驱使我们要更进一步。不由自主的我们发现了系统的数据存在着大量的重复信息。例如Date Of Birth其实已经在ID中编码了,所以Date Of Birth可以直接从ID中得到,而不必使用额外的空间去它。

经过改良,Person类现在变成了这个样子:

// Imports and methods removed to improve readabilitypublic class Person {    private String id;    private String forename;    private String surname;}

重新跑一边测试证实我们的改进的确有效,堆消耗降低到了93MB。但是我们还未满足。

该应用在64位的机器上使用老的JDK6。默认情况下,这么做不能 压缩普通对象的指针的。通过参数” -XX:UseCompressedOops“切换到压缩模式使我们获得了额外的收获,现在我们的内存消耗降低到了73MB。


当然,我们还能走的更远。比如基于键值建立B-tree,但这已经开始影响到了代码的可读性,所以我们决定到此为止。降低21.5倍的堆内存应该已经是一个足够好的结果了。

让我们再重复一下学到了什么

如果你对这个实验很好奇,请在此处 下载相关的代码。使用到的的测量工具和其具体描述可以在这篇 博文找到。

  • 别把同外部模块的整合影响到系统的每一个角落
  • 冗余的数据可能带来开销。在可能的情况下尽量消除它
  • 基本数据类型是你最经常打交道的朋友,务必知道些关于它们的工具,如果还没玩过 Trove请立刻开始吧
  • JVM自带的优化技术不可忽视

原文链接:  Nikita Salnikov-Tarnovski ,编译:感谢@ NULL_文龙 的热心翻译

译文链接: http://blog.jobbole.com/40666/

提升网站知名度的十大方法 IBM移动平台首席架构师Greg Truty:MobileFirst从底层架构开始 Hallo.js:一款所见即所得的Web编辑器 数据分析≠Hadoop+NoSQL,不妨先看完善现有技术的10条捷径 移动周报:百度收购91,19亿美金背后的博弈 植物大战僵尸2:“免费+内付费”模式引发争论 [CTO俱乐部第103期] 高德和四维图新技术高管谈地图导航的发展与挑战 Java 7爆最新漏洞,10年前的攻击手法仍有效 Twitter联合创始人Biz Stone谈Facebook用户体验 提倡零广告 英雄会:企业的人才漏斗 开发者的武林大会 一次错误估算带来的启示 苹果开发者中心被黑:开发者信息或被窃取 SIM卡加密存漏洞 将影响数亿计的手机用户 搜狗茹立云:探索引擎产品落地 浏览器+搜索模式会成主流吗? 大势所趋,IBM Acme Air至少使用Netflix的5个开源工具 【观察】跨越“朦胧期”的云计算:产业、核心技术、生态圈以及突破点 Rovio Account:平台化之路修成正果 甲骨文总裁马克•赫德采访实录:用软硬件集成一体机打垮对手 如何一步一步打造高可扩展性的应用程序? 用Java编程,请保持简洁! 从安全隐患带来的商机来看,Hadoop同样很美 三年增四倍:如今谷歌服务占北美互联网流量四分之一 决战低功耗?Intel明年推低功耗Xeon处理器 在软件架构上增加新功能的注意事项 90后的代码界“女神”李雪:在编程中找到自己的“灵魂” 大数据之路不乏荆棘,然则其中的机遇却高于一切 iPhone销量令人意外:苹果Q3财季净利69亿美元 同比下滑 励志:12位早起的IT大佬们让小伙伴们都惊呆了 独家:苹果5周年限免神作,BADLAND开发者访谈 10亿次订阅!苹果Podcast的里程碑 免费利器Unity 4.2正式发布 支持WP8、Win8和BB10 最大化窗口出现问题 有关WORD文件的打开,,, 我的硬盘少的不正常吗? 大问题::创建一个DataStore后,怎么写那些Retrieve条件啊?怎么用不了scrolltorow()?? C#鼠标事件的问题,急!!!(在线等待) 怎么样查询 想发布一点东西,什么网站好 关于打印问题:2K下如何能调用到office的打印设置窗口?(在线等,马上结贴,来者有分) 请教一个基本问题 六百里加急!!! 在线等,关于数据报表 菜鸟问题 求职 急!midas问题,高手请进 如何让下拉框只在选中的情况下出现那个三角形的下拉按钮啊?可以吗? 在hp—unix系统编c程序出现下面的错误 快来看啊!刚出炉的求解大送分!!Datagrid事件的问题,不要错过好!!简单!分多!! 哪里可以下载jbuilder9企业版?? 哪里有免费的空间可以申请? 如何获取某个窗体中各个部分的类名??? 我是一个刚刚对计算机感兴趣的人,想问一下大虾几个问题!! 有谁遇到过这样的问题?请大家帮一下忙!谢谢! 请问 jfreechart 怎么使用 ? 100 分请教!!! 数据库日志被删怎么办??? 怎样设置EDIT的长度设题????急!!!!!!!!!! 求职 求职 求职 求职 求职 求职 哪里有“Java Servlet Programming, 2nd Edition”电子书下载? 急,有关读写文本文件的! 北京掌中仙境技术有限公司招聘程序开发人员 在.net中如何获得数据库中的所有用户表的信息,以及......? 在线等!!菜鸟一问:用什么函数使‘空’返回为零,就像foxpro的iif... 如何实现两个form间参数的传递? 一个关于DBCHART的使用问题。 数据机构的一道题!~(队列) 求救高手?active dll的Ftp上传组件的问题?(100) TQuery返回的字段类型信息如何区分numeric还是float? 我感觉VC里最神秘的几块内容(至今也没搞懂) 在这里混了有段日子了 升星 散分!!(请版主别删) 欢迎大家加入我建的QQ群 请问一下各位是如何调用第三方的DLL。例如:华为DLL.清华深资DLL。等等。。。 QRBand能否自动换页的问题。 请问有哪位 有ACCP的的全套资料第一学期第一学年 资料 一个关treeview的问题 sql server有没有办法看一个image类型值是否有无? 嵌入到outlook控件的问题 一个奇怪的问题: 怎么老打不开数据库set db= new notesdatabase("","data.nsf")??? 如何调用DLL啊? JSP怎么样调用sessionbean? 如何在Cell单元格显示数据库中已image类型存放的图片?(急) php有什么好办法把mysql里面枚举型字段的各个项目读出来? pain什么意思 7.08+8.13×12.9÷(86×40.65) 求20个病句并修改, some are doubled up in Several people were moaining and groaning,some were doubled up in pain,and two even were unconscious.这里的some were doubled up in pain中的doubled 私人可以开自来水公司吗? request.getParameter("username") == null "" :request.getParameter("username") 里的?和:怎么理解 词组的意思请帮忙some are doubled up in painSeveral people were moaining and groaning,some were doubled up in pain,and two even were unconscious.这里的some were doubled up in pain中的doubled 石灰吟的意思是什么 String userName=request.getParameter("userName");什么意思 How to make up for the pain. 自来水属于国家还是私人.近日回了一趟老家,毕竟是农村,肯定不是想居民点哪样集中(其实我们这里也有6家人),挨到的都安装了自来水,“为什么我们这里没按起来”我问父亲.他说:“自来 辛弃疾什么意思 若一个正多边形的内角和是外角和的5倍这是一个正几边形 《石灰吟》的大致意思是什么.急. 稼轩什么意思 一个正多边形的每个内角是它相邻外角的5倍,求这个多边形 我想问一下,新建一个自来水厂属于水利水电工程吗 辛弃疾有什么四卷 原苏联加盟共和国的名称 篆书是先有大篆还是先有小篆大篆和小篆的哪个历史长久一些 已知成等差数列的3个正数的和等于15,且这3个正数依次加9,后,则成等比数列,求这3个正数 俄国是什么时候的叫法? 篆书以大篆为主还是小篆啊? 修改病句下面的怎么改,因为这是山区的一个小站,所以站上的工作搞得很出色.汗水慢慢的从他额头上不断的滴下.修改病句?非洲是个多姿多彩的世界.换种句式,意思保持不变. cuz 是一个简写的单词,i have nochance to online cuz i forgoten my pass word to log inmy email这是完整的句子 求 飒 字篆书体 大篆 小篆 都要 阅读伟人细胞 如果你是贾里的朋友 会怎么样劝他 100字 lol和coz在英语书写中是什么的缩写?请举例 现在市面上的字库里篆书字体里角篆、方篆、印篆是属于哪类篆书,是大篆还是小篆?要是平时书写的话,用哪种合适? 阅读伟人细胞 如果你是贾里的朋友 会怎么样劝他 我在学习中遇到困惑,哲学上的,我在探索数学,对这些,乃至探索本身都产生了怀疑.比如觉得有些数学思想的由来觉得很感到困惑,它到底是怎么得出的,并且为什么在理论体系内能由条件得出结 张斌的篆书怎么写,不要大篆,希望是那种比较工整的,要刻一个名章, 《伟人细胞》中你想对贾里说什么 50个字左右 哲学课上提的一个令人困惑烦人问题你人生中最最要的事是什么?最重要的人是谁? 经常吃热食对身体有哪些危害 修改下面的病句急王明被评为我们班的班长. 混凝士碳化是什么意思 能量供应不足和过剩会对人体造成什么伤害 改病句,具体如下!急.弓着腰,撑着四爪,瞪大眼睛盯着面前一顿快到口的美味.真有不吃掉决不罢休的气势.也许好像是激怒了小青蛙,小青蛙的眼睛瞪得更大了. sin和cos是什么,怎么作用计算方式中 切削液的种类很多,按其性质,可分为哪三大类? 沐( )而冠 ( )( )撼树 投( )忌器 ( )( )学舌 风声( )( ) ( )占( )巢 请问篆字有几种?这几个字是属于哪种? 脱氧核酸和脱氧核苷酸的区别RT 干枯( )( )( )( )秀丽夜不( )( ) sin38°化成分数的形式等于多少 国画按类型分,分为哪三大类 设a>b>0,A是a,b的等差中项,G是a,b的等比中项,(G>0)且A=2G,则a/b等于 不使用计算器的情况下只知道一个角度数如何计算Cos tan sin的带根号的形式有办法吗 脱氧核苷酸和脱氧核酸有什么区别? 若两数a,b的等差中项等于这两数的等比中项,则a/b的值多少? 苏联解体的15个加盟共和国,是俄罗斯分裂出去的吗 请教,真正的素质教育是什么样的大神们帮帮忙理论少点,说点现实的样子 港版苹果5是英文字吗? 土耳其,俄罗斯,前苏联分出的15个加盟共和国各属亚洲还是欧洲? 非国民素质教育是个啥?这样的本科证有用吗? 微信雷达添加朋友的距离是多少 苏联15个加盟共和国与中国接壤的有哪些? 25又9分之五*29+65又9分之5*29+1/9*29 英语改病句 ①This photo often makes me to think of my teacher in Grade Seven②Our team won the team of Class Two③Tow thousands people are watching the rising of our national flag④We are all listening to beautiful music careful ⑤The idea 伊朗外长与联合国-阿盟特别代表呼吁政孟加拉国总理呼吁反对党取消全国大罢工奥地利总理国庆讲话告诫不忘纳粹历史巴勒斯坦呼吁共同抵制以扩建犹太人定居印度东部洪灾死亡人数升至45人李娜打入总决赛排名进Top3 创亚洲河南济源一路段7公里6个“收费站”专刘云山:教育实践活动整改工作要准、狠白岩松惋惜恒大未能锁定胜局:首尔死刑亚冠决赛首回合恒大2-2首尔 穆里奇中国科学家成功研发人感染H7N9禽流宗庆后语出惊人:中国不能再造房子了李克强在中南海紫光阁会见东盟十国经贸捅死医生的连恩青烦躁时砸东西打母亲 亚冠决赛首回合恒大2-2首尔 穆里奇美国“窃听门”持续发酵 欧洲各国一致德国品牌专家:中国品牌升级要品质更要浙江省委书记夏宝龙:希望天下浙商争做亚洲食学国际论坛登陆绍兴 中国大厨展杭州女装与国际女装相遇 传统丝绸碰撞淘宝店家支付宝“被贷款” 阿里服务热新舟60交付遭新西兰无端指责 麻烦制中央和行业类媒体采编人员赣州行活动圆习近平3日起专程访韩“走鬼”怎么管?学校周边可否摆卖小食检验检疫12365成功调解进口汽车质李明华:战犯笔供未做删节处理 但虚化租车出游路上抛锚维修费用该谁埋单?法存款受阻将水倒入ATM机 敖某因涉嫌7月拍牌26日举行:个人额度7400安理会声明谴责杀害巴勒斯坦青年事件香港逾60%服务业者自认高水平 仅6中国160MN等温锻压机成功试车 助浙江永康“美女老板”卷款潜逃在乌干达1小时惊魂救险:男子凌晨坠落山崖 消日本九州地区持续降雨天气 或致河流泛美联储主席耶伦:不宜用加息抑制金融风泰国前副总理:泰国会成为沟通东盟与中45名日本战犯笔供近20万页 中国今柯文哲的8千万透视甲午战争俄国野心:对华诱胁并举掠北京公共交通调价首次在方案制定前征民
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘