温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JVM系列四:HotSpot VM GC 的种类

发布时间:2020-08-15 09:50:30 来源:网络 阅读:803 作者:wxl604746107 栏目:软件技术

HotSpotVMGC的种类

collector种类

GC在HotSpotVM5.0里有四种:

incremental(sometimescalledtrain)lowpausecollector已被废弃,不在介绍.

类别serialcollector(串行)parallelcollector(并行)
(throughputcollector)---(关注吞吐量)
concurrentcollector(并发)
(concurrentlowpausecollector)----(关注响应时间)
介绍

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

并行收集器
使用多线程的方式,利用多CUP来提高GC的效率
主要以到达一定的吞吐量为目标

并发收集器
使用多线程的方式,利用多CUP来提高GC的效率
并发完成大部分工作,使得gcpause短

试用场景单处理器机器且没有pausetime的要求

适用于科学技术和后台处理
有中规模/大规模数据集大小的应用且运行在多处理器上,关注吞吐量(throughput)

适合中规模/大规模数据集大小的应用,应用服务器,电信领域
关注responsetime,而不是throughput

使用Client模式下默认
可使用
可用-XX:+UseSerialGC强制使用
优点:对server应用没什么优点
缺点:慢,不能充分发挥硬件资源

Server模式下默认

--YGC:PSFGC:ParallelMSC

可用-XX:+UseParallelGC或-XX:+UseParallelOldGC强制指定

--ParallelGC代表FGC为ParallelMSC

--ParallelOldGC代表FGC为ParallelCompacting

优点:高效

缺点:当heap变大后,造成的暂停时间会变得比较长

可用-XX:+UseConcMarkSweepGC强制指定
优点:
对old进行回收时,对应用造成的暂停时间非常短,适合对响应时间要求比较高的应用
缺点:
1.内存碎片和浮动垃圾
2.old去的内存分配效率低
3.回收的整个耗时比较长
4.和应用争抢CPU
内存回收触发YGC
eden空间不足
FGC
old空间不足
perm空间不足
显示调用System.gc(),包括RMI等的定时触发
YGC时的悲观策略
dumplive的内存信息时(jmap–dump:live)
YGC
eden空间不足
FGC
old空间不足
perm空间不足
显示调用System.gc(),包括RMI等的定时触发
YGC时的悲观策略--YGC前&YGC后
dumplive的内存信息时(jmap–dump:live)
YGC
eden空间不足
CMSGC
1.oldGen的使用率达到一定的比率默认为92%
2.配置了CMSClassUnloadingEnabled,且PermGen的使用达到一定的比率默认为92%
3.Hotspot自己根据估计决定是否要触法
4.在配置了ExplictGCInvokesConcurrent的情况下显示调用了System.gc.
FullGC(SerialMSC)
promotionfailed或concurrentModeFailure时;
内存回收触发时发生了什么YGC
清空eden+from中所有noref的对象占用的内存
将eden+from中的所有存活的对象copy到to中
在这个过程中一些对象将晋升到old中:
--to放不下的
--存活次数超过tenuringthreshold的
重新计算TenuringThreshold;
单线程做以上动作
全程暂停应用
FGC
如果配置了CollectGen0First,则先触发YGC
清空heap中noref的对象,permgen中已经被卸载的classloader中加载的class的信息
单线程做以上动作
全程暂停应用
YGC
同serial动作基本相同,不同点:
1.多线程处理
2.YGC的最后不仅重新计算TenuringThreshold,还会重新调整Eden和From的大小
FGC
1.如配置了ScavengeBeforeFullGC(默认),则先触发YGC(??)
2.MSC:清空heap中的noref对象,permgen中已经被卸载的classloader中加载的class信息,并进行压缩
3.Compacting:清空heap中部分noref的对象,permgen中已经被卸载的classloader中加载的class信息,并进行部分压缩
多线程做以上动作.


YGC
同serial动作基本相同,不同点:
1.多线程处理
CMSGC:
1.oldgen到达比率时只清除oldgen中noref的对象所占用的空间
2.permgen到达比率时只清除已被清除的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后动态调整edenfrom已经tenuringthreshold的动作

-XX:ParallelGCThreads设置并行的线程数

-XX:CMSInitiatingOccupancyFraction设置oldgen使用到达多少比率时触发
-XX:CMSInitiatingPermOccupancyFraction,设置PermGen使用到达多少比率时触发
-XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行触发CMSGC

注:

  • throughputcollector与concurrentlowpausecollector的区别是throughputcollector只在youngarea使用使用多线程,而concurrentlowpausecollector则在tenuredgeneration也使用多线程。

  • 根据官方文档,他们俩个需要在多CPU的情况下,才能发挥作用。在一个CPU的情况下,还不如默认的serialcollector,因为线程管理需要耗费CPU资源。而在两个CPU的情况下,也提高不大。只是在更多CPU的情况下,才会有所提高。当然concurrentlowpausecollector有一种模式可以在CPU较少的机器上,提供尽可能少的停顿的模式,见CMSGCIncrementalmode

  • 当要使用throughputcollector时,在javaopt里加上-XX:+UseParallelGC,启动throughputcollector收集。也可加上-XX:ParallelGCThreads=<desirednumber>来改变线程数。还有两个参数-XX:MaxGCPauseMillis=<nnn>和-XX:GCTimeRatio=<nnn>,MaxGCPauseMillis=<nnn>用来控制最大暂停时间,而-XX:GCTimeRatio可以提高GC说占CPU的比,以最大话的减小heap。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI