如果在CMS运行期间,预留的内存无法满足程序需要,就会出现一次ConcurrentMode Failure失败,此时虚拟机将启动预备方案,使用Serial Old收集器重新进行年老代垃圾回收。
c.CMS收集器是基于标记-清除算法,因此不可避免会产生大量不连续的内存碎片,如果无法找到一块足够大的连续内存存放对象时,将会触发因此Full GC。CMS提供一个开关参数-XX:+UseCMSCompactAtFullCollection,用于指定在Full GC之后进行内存整理,内存整理会使得垃圾收集停顿时间变长,CMS提供了另外一个参数-XX:CMSFullGCsBeforeCompaction,用于设置在执行多少次不压缩的Full GC之后,跟着再来一次内存整理。
(7).G1收集器:
Garbage first垃圾收集器是目前垃圾收集器理论发展的最前沿成果,相比与CMS收集器,G1收集器两个最突出的改进是:
a.基于标记-整理算法,不产生内存碎片。
b.可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。
G1收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾最多的区域。
区域划分和优先级区域回收机制,确保G1收集器可以在有限时间获得最高的垃圾收集效率。
Java虚拟机常用的垃圾收集器相关参数如下:
| 参数 |
描述 |
| UseSerialGC |
虚拟机运行在Client模式的默认值,打开此开关参数后, |
| UseParNewGC |
打开此开关参数后,使用ParNew+Serial Old收集器组合进 |
| UseConcMarkSweepGC |
打开此开关参数后,使用ParNew+CMS+Serial Old收集器组 |
| UseParallelGC |
虚拟机运行在Server模式的默认值,打开此开关参数后, |
| UseParallelOldGC |
打开此开关参数后, |
| SurvivorRation |
新生代内存中Eden区域与Survivor区域容量比值,默认是8,即 |
| PretenureSizeThreshold |
直接晋升到年老代的对象大小,设置此参数后,超过该大小的 |
| MaxTenuringThreshold |
直接晋升到年老代的对象年龄,每个对象在一次Minor GC之后还 |
| UseAdaptiveSizePolicy |
java虚拟机动态自适应策略,动态调整年老代对象年龄和各个区域大小。 |
| HandlePromotionFailure |
是否允许担保分配内存失败,即整个年老代空间不足,而整个新生代中Eden和Survivor对象都存活的极端情况。 |
| ParallelGCThreads |
设置并行GC时进行内存回收的线程数。 |
| GCTimeRation |
Parallel Scavenge收集器运行时间占总时间比率。 |
| MaxGCPauseMillis |
Parallel Scavenge收集器最大GC停顿时间。 |
| CMSInitiatingOccupancyFraction |
设置CMS收集器在年老代空间被使用多少百分比之后触发垃圾收集,默认是68%。 |
| UseCMSCompactAtFullCollection |
设置CMS收集器在完成垃圾收集之后是否进行一次内存整理。 |
| CMSFullGCsBeforeCompaction |
设置CMS收集器在进行多少次垃圾收集之后才进行一次内存整理。 |
-verbose:gc可以查看Java虚拟机垃圾收集结果。