内存(条)是便宜,很不幸,垃圾回收机制导致的暂停会严重影响系统性能,好像JVM内存最多支持2G,作者花费大量时间精力使用32G来提高系统性能,这篇是其心得。
GC微调是非常和应用有关,该篇的目标要求是:使用10G更大Heaps和严格的响应时间(毫秒级别),(吞吐量和延迟性是一对矛盾,这次GC微调主要是追求低延迟)。作者项目特点是:
1.Heap用于在内存中储存数据结构
2.Heap大小超过10G
3.请求时间要求更快
4.事务是短的(几百毫秒)
一个事务可以包括几个请求
5.内存中数据修改频率和面积低,不会一秒内修改整个10G内存,每秒更新10M即可。
此处省略垃圾回收机制原理介绍.....
总体来说,banq注:JVM分新生代和旧生代,新创建在新生代,通过新生代垃圾回收,如果不能被回收,将逐步转入旧生代,旧生代内存可以实现缓存In-memeory数据,显然新旧两代的垃圾回收算法最好不一样,新生代需要频繁,而旧生代不需要频繁,如果我们内存缓存控制得好,旧生代就不会启动垃圾回收机制,这样就不会导致系统暂停。
该文介绍如何来进行新生代大小调节,防止垃圾回收机制频繁启动,先使用XX:MaxNewSize=
-XX:NewSize= 指定新生代大小,使用-XX:+PrintGCDetails -XX:+PrintTenuringDistribution
-XX:+PrintGCTimestamps)输出GC诊断结果。
有几个数据需要计算一下:
新生代收集期间值,整个分配情况,短生命对象的分配大小,长生命对象的分配情况,中等生命对象分配。
我个人更喜欢使用psi-Probe安装在tomcat下,一目了然,如附件图:
配置恰当的缓存Cache策略来解决GC问题也相当重要,我们提倡基于内存的领域对象编程,大量数据都在缓存中in-memory,如何保证他们的生命周期和JVM的垃圾回收机制不冲突,也是一种实际问题,文章提出下面几点:
1.为缓存增加失效期,让新生代的GC期间要长于缓存的失效期,也就是缓存中对象数据失效后,正好GC启动后可以回收这些失效对象。
2.增加延长新生代的GC期间。
3.在缓存中使用弱引用。缓存产品自己的事,和我们应用者无关。
4.增加缓存大小,我个人经验尽可能将数据库数据以领域对象方式都加载到内存中。
JVM首先分配所有对在新生代,然后将幸存对象(一般是缓存中对象)再分配到旧生代,或再分配到新生代,这些对象的拷贝将耗费时间导致新生代收集暂停,两种选择:
1.在第一次收集时,就将对象复制到旧生代
2.第二次收集时,将对象复制到旧生代。
第一种办法将导致一些短生命周期对象复制到旧生代,第二种办法需要注意新生代垃圾收集的频度和长生命周期对象是否小。
对于一个巨大的heap,新生代垃圾收集暂停主要是在空间扫描和复制幸存对象上,在新生代大小上需要取得一个平衡,旧生代大小足够放入应用的数据,比如JiveJdon一天下来缓存的大小是200K左右(每天启动的情况下),只要旧生代大小大于这个值即可,不能太大,也不能太小。
增加新生代大小要增加整个JVM大小,否则就会降低旧生代的内存大小。
可以配置CMS短期暂停:–XX:CMSWaitDuration
–设置收集暂停的最大间隔时间,越大你的应用将被暂停,类似死机没有反应。XX:+CMSScavengeBeforeRemark
可以避免在收集期间同时扫描。
原文还提到CMS(Concurrent Mark
Sweep)激活会导致暂停等等。
针对不同应用特点进行算法配置,在线事务处理将耗费响应时间,而批处理将产生大量垃圾,这些都要用不同JVM来处理。
分享到:
相关推荐
GC java 手册 kindle格式 GC java 手册 kindle格式 GC java 手册 kindle格式
让你对java gc 的工作原理有更深的了解 谢谢下载
GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...
NULL 博文链接:https://wangwengcn.iteye.com/blog/1606192
Java基础[Java基础]--Java GC工作原理
Java GC与性能调优文档 作者:高飞
成为JavaGC专家PartII—如何监控Java垃圾回收机制Java开发Java经验技巧共12页.pdf.zip
Java SE编程入门教程 java GC(共6页).pptx Java SE编程入门教程 java instanceof(共3页).pptx Java SE编程入门教程 java IO(共28页).pptx Java SE编程入门教程 java Math(共11页).pptx Java SE编程入门教程 ...
Java GC的副本.pptx
jvm配置参数详解,以及Java gc详解
在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...
NULL 博文链接:https://seanzhou.iteye.com/blog/2003941
白话说java gc垃圾回收.docx
JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
GCViewer 能否分析 java 程序 GC 日志,能否图表展示堆内存,年轻代,老年代,永久带以及full gc 的使用情况
NULL 博文链接:https://4ujava.iteye.com/blog/553867
Java VisualVM GC插件
一般Full GC时,机器的Load会升高,应用也会停止响应一会(持续长达几秒),如果应用一直频繁的进行FullGC,一方面会出现应用无法提供正常服务,另一方面甚至会导致应用崩溃址至挂掉。 所以观察应用的GC频率是可以...