您的位置:首页 > 其它

HotSpot VM GC 的种类

2016-07-22 19:59 766 查看
collector种类      

GC在 HotSpot VM 5.0里有四种:

类别serial collectorparallel collector
( throughput collector )
concurrent collector

(concurrent low pause collector)
介绍单线程收集器

使用单线程去完成所有的gc工作,没有线程间的通信,这种方式会相对高效
并行收集器

使用多线程的方式,利用多CUP来提高GC的效率

主要以到达一定的吞吐量为目标
并发收集器

使用多线程的方式,利用多CUP来提高GC的效率

并发完成大部分工作,使得gc pause短
试用场景单处理器机器且没有pause time的要求适用于科学技术和后台处理

有中规模/大规模数据集大小的应用且运行在多处理器上,关注吞吐量(throughput)
适合中规模/大规模数据集大小的应用,应用服务器,电信领域

关注response time,而不是throughput
使用Client模式下默认

可使用

可用-XX:+UseSerialGC强制使用

优点:对server应用没什么优点

缺点:慢,不能充分发挥硬件资源
Server模式下默认
--YGC:PS FGC:Parallel MSC
可用-XX:+UseParallelGC或-XX:+UseParallelOldGC强制指定
--ParallelGC代表FGC为Parallel MSC
--ParallelOldGC代表FGC为Parallel Compacting
优点:高效
缺点:当heap变大后,造成的暂停时间会变得比较长
可用-XX:+
UseConcMarkSweepGC强制指定
优点:

对old进行回收时,对应用造成的暂停时间非常端,适合对latency要求比较高的应用
缺点:

1.内存碎片和浮动垃圾

2.old去的内存分配效率低

3.回收的整个耗时比较长

4.和应用争抢CPU
内存回收触发YGC
eden空间不足
FGC
old空间不足

perm空间不足

显示调用System.gc() ,包括RMI等的定时触发
YGC时的悲观策略

dump live的内存信息时(jmap –dump:live)

      
YGC
eden空间不足
FGC
old空间不足

perm空间不足

显示调用System.gc() ,包括RMI等的定时触发
YGC时的悲观策略--YGC前&YGC后

dump live的内存信息时(jmap –dump:live)

      
YGC
eden空间不足
CMS GC
1.old Gen的使用率大的一定的比率 默认为92%

2.配置了CMSClassUnloadingEnabled,且Perm Gen的使用达到一定的比率 默认为92%

3.Hotspot自己根据估计决定是否要触法

4.在配置了ExplictGCInvokesConcurrent的情况下显示调用了System.gc.
Full GC(Serial MSC)
promotion failed 或 concurrent Mode Failure时;
内存回收触发时发生了什么YGC
清空eden+from中所有no ref的对象占用的内存

将eden+from中的所有存活的对象copy到to中

在这个过程中一些对象将晋升到old中:

--to放不下的

--存活次数超过tenuring threshold的

重新计算Tenuring Threshold;

单线程做以上动作

全程暂停应用
FGC
如果配置了CollectGen0First,则先触发YGC

清空heap中no ref的对象,permgen中已经被卸载的classloader中加载的class的信息

单线程做以上动作

全程暂停应用
YGC
同serial动作基本相同,不同点:

1.多线程处理

2.YGC的最后不仅重新计算Tenuring Threshold,还会重新调整Eden和From的大小
FGC

1.如配置了ScavengeBeforeFullGC(默认),则先触发YGC(??)

2.MSC:清空heap中的no ref对象,permgen中已经被卸载的classloader中加载的class信息,并进行压缩

3.Compacting:清空heap中部分no ref的对象,permgen中已经被卸载的classloader中加载的class信息,并进行部分压缩

多线程做以上动作.

YGC

同serial动作基本相同,不同点:

1.多线程处理
CMSGC:
1.old gen到达比率时只清除old gen中no ref的对象所占用的空间

2.perm gen到达比率时只清除已被清除的classloader加载的class信息
FGC
同serial
细节参数可用-XX:+UseSerialGC强制使用

-XX:SurvivorRatio=x,控制eden/s0/s1的大小

-XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数

-XX:PretenureSizeThreshold=x,控制超过多大的字节的对象就在old分配.
-XX:SurvivorRatio=x,控制eden/s0/s1的大小

-XX:MaxTenuringThreshold,用于控制对象在新生代存活的最大次数
-XX:UseAdaptiveSizePolicy 去掉YGC后动态调整eden from已经tenuringthreshold的动作
-XX:ParallelGCThreads 设置并行的线程数
-XX:CMSInitiatingOccupancyFraction 设置old gen使用到达多少比率时触发

-XX:CMSInitiatingPermOccupancyFraction,设置Perm Gen使用到达多少比率时触发

-XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行触发CMS GC
注:
throughput collector与concurrent low pause collector的区别是throughput collector只在young area使用使用多线程,而concurrent low pause collector则在tenured generation也使用多线程。
根据官方文档,他们俩个需要在多CPU的情况下,才能发挥作用。在一个CPU的情况下,会不如默认的serial collector,因为线程管理需要耗费CPU资源。而在两个CPU的情况下,也提高不大。只是在更多CPU的情况下,才会有所提高。当然 concurrent low pause collector有一种模式可以在CPU较少的机器上,提供尽可能少的停顿的模式,见CMS
GC Incremental mode。
当要使用throughput collector时,在java opt里加上-XX:+UseParallelGC,启动throughput collector收集。也可加上-XX:ParallelGCThreads=<desired number>来改变线程数。还有两个参数 -XX:MaxGCPauseMillis=<nnn>和 -XX:GCTimeRatio=<nnn>,MaxGCPauseMillis=<nnn>用来控制最大暂停时间,而-XX:
GCTimeRatio可以提高GC说占CPU的比,以最大话的减小heap。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: