JVM
===================================FULL GC 出现的几种情况==================
1. System.gc()方法的调用
2. 老年代代空间不足
3. 永久区空间不足
4. CMS GC 时出现 promotion failed 和 concurrent mode failure。
说明:对于采用 CMS 进行老年代 GC 的程序而言,尤其要注意 GC 日志中是否有 promotion failed 和 concurrent mode
failure 两种状况。
5. 统计得到的 Minor GC 晋升到老年代的平均大小大于老年代的剩余空间
6. 堆中分配很大的对象
说明:大对象,是指需要大量连续内存空间的 java 对象,例如很长的数组。老年代虽然有很大的剩余空间,
但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发 JVM 进行 Full GC。一般使用
-XX:+UseCMSCompactAtFullCollection 和 -XX:CMSFullGCsBeforeCompaction 参数结合来解决问题。
7. NIO 使用 DirectBuffer 分配物理内存,空间不足。
说明:当 DirectBuffer 占用内存空间不足时,会显示调用 system.gc(),主动触发 fullgc。所以对于 NIO 的应用建
议不要在 JVM 启动参数中追加-XX:+ DisableExplicitGC,否则会出现 DirectBuffer oom。
====================================CMS 常用参数============================
-XX:+UseConcMarkSweepGC 启用 CMS。
-XX:+UseCMSCompactAtFullCollection 在 full gc 的时候,对 old 区压缩。
-XX:+CMSScavengeBeforeRemark 这个参数还重要的,它的意思是在执行 CMS
remark 之前进行一次 youngGC,这样能有效降低 remark 的时间,之前没有加这
个参数,remark 时间最大能达到 3s,加上这个参数之后 remark 时间减少到 1s
之内。但是 remark 之后也将立即开始又一次 minor gc。
-XX:CMSFullGCsBeforeCompaction=1 多少次 full gc 后进行 old 区压缩,cms
会产生 old 区"碎片",要进行整理,避免没有连续空间放大对象而引发 cms failure
出现。
-XX:CMSInitiatingOccupancyFraction=70 old 区使用 70%后开始 CMS 收集,
-XX:CMSInitiatingPermOccupancyFraction=70 perm 区使用 70%后开始 CMS
收集,
本文来自博客园,作者:up~up,转载请注明原文链接:https://www.cnblogs.com/soft-engineer/articles/15867391.html
浙公网安备 33010602011771号