课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
性能优化是程序员在学习java编程开发技术需要重点关注的一个问题,而今天我们就一起来了解一下,java编程性能调优常见问题。
内存碎片&收集器退化
现象
并发的CMSGC算法,退化为Foreground单线程串行GC模式,STW时间超长,有时会长达十几秒。其中CMS收集器退化后单线程串行GC算法有两种:
带压缩动作的算法,称为MSC,上面我们介绍过,使用标记-清理-压缩,单线程全暂停的方式,对整个堆进行垃圾收集,也就是真正意义上的FullGC,暂停时间要长于普通CMS。
不带压缩动作的算法,收集Old区,和普通的CMS算法比较相似,暂停时间相对MSC算法短一些。
原型分析
晋升失败(PromotionFailed):old空间不足或者碎片导致晋升失败,由于concurrentMarkSweepThread和担保机制的存在,发生的条件是很苛刻的
增量收集担保失败:分配内存失败后,会判断统计得到的YoungGC晋升到Old的平均大小,以及当前Young区已使用的大小也就是大可能晋升的对象大小,是否大于Old区的剩余空间。只要CMS的剩余空间比前两者的任意一者大,CMS就认为晋升还是安全的,反之,则代表不安全,不进行YoungGC,直接触发FullGC。
显示GC
并发模式失败(ConcurrentModeFailure)
解决方案
分析到具体原因后,我们就可以针对性解决了,具体思路还是从根因出发,具体解决策略:
内存碎片:通过配置-XX:UseCMSCompactAtFullCollection=true来控制FullGC的过程中是否进行空间的整理(默认开启,注意是FullGC,不是普通CMSGC),以及-XX:CMSFullGCsBeforeCompaction=n来控制多少次FullGC后进行一次压缩(可以使用-XX:PrintFLSStatistics来观察内存碎片率情况,然后再设置具体的值)
增量收集:降低触发CMSGC的阈值,即参数-XX:CMSInitiatingOccupancyFraction的值,让CMSGC尽早执行,以保证有足够的连续空间,也减少Old区空间的使用大小,另外需要使用-XX:+UseCMSInitiatingOccupancyOnly来配合使用,不然JVM仅在一次使用设定值,后续则自动调整。
浮动垃圾:视情况控制每次晋升对象的大小,或者缩短每次CMSGC的时间,必要时可调节NewRatio的值。另外就是使用-XX:+CMSScavengeBeforeRemark在过程中提前触发一次YoungGC,防止后续晋升过多对象。
希望这辈子,最让你无悔的事情就是来达内学习!学习向来不是件易事,但无论过程多么艰难,希望你依然热爱生活,热爱学习!永远记得,达内将与你一同前行!现在扫码,立即领取万元课程礼包,助力0基础快速入行,为你梳理行业必备技能,全方位了解岗位发展前景!
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。