深入理解java虚拟机[Java虚拟机垃圾收集器](二)

2014-11-24 03:16:57 · 作者: · 浏览: 4
设置年老代空间达到多少的百分比时触发CMS进行垃圾收集,默认是68%。

如果在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模式的默认值,打开此开关参数后,
使用Serial+Serial Old收集器组合进行垃圾收集。

UseParNewGC

打开此开关参数后,使用ParNew+Serial Old收集器组合进
行垃圾收集。

UseConcMarkSweepGC

打开此开关参数后,使用ParNew+CMS+Serial Old收集器组
合进行垃圾收集。Serial Old作为CMS收集器出现Concurrent
Mode Failure的备用垃圾收集器。

UseParallelGC

虚拟机运行在Server模式的默认值,打开此开关参数后,
使用Parallel Scavenge+Serial Old收集器组合进行垃圾收集。

UseParallelOldGC

打开此开关参数后,
使用Parallel Scavenge+Parallel Old收集器组合进行垃圾收集。

SurvivorRation

新生代内存中Eden区域与Survivor区域容量比值,默认是8,即
Eden:Survivor=8:1.

PretenureSizeThreshold

直接晋升到年老代的对象大小,设置此参数后,超过该大小的
对象直接在年老代中分配内存。

MaxTenuringThreshold

直接晋升到年老代的对象年龄,每个对象在一次Minor GC之后还
存活,则年龄加1,当年龄超过该值时进入年老代。

UseAdaptiveSizePolicy

java虚拟机动态自适应策略,动态调整年老代对象年龄和各个区域大小。

HandlePromotionFailure

是否允许担保分配内存失败,即整个年老代空间不足,而整个新生代中Eden和Survivor对象都存活的极端情况。

ParallelGCThreads

设置并行GC时进行内存回收的线程数。

GCTimeRation

Parallel Scavenge收集器运行时间占总时间比率。

MaxGCPauseMillis

Parallel Scavenge收集器最大GC停顿时间。

CMSInitiatingOccupancyFraction

设置CMS收集器在年老代空间被使用多少百分比之后触发垃圾收集,默认是68%。

UseCMSCompactAtFullCollection

设置CMS收集器在完成垃圾收集之后是否进行一次内存整理。

CMSFullGCsBeforeCompaction

设置CMS收集器在进行多少次垃圾收集之后才进行一次内存整理。

java虚拟机的-XX:+PrintGCDetails参数可以打印垃圾收集器的日志信息。

-verbose:gc可以查看Java虚拟机垃圾收集结果。