您的位置:首页 > 其它

58内部使用的垃圾收集器

2017-05-22 16:44 211 查看
对于很多互联网的应用程序来说,快速响应比服务所支持的吞吐量更重要。
在Stop-The-World模式下,在整个垃圾回收的期间,应用程序都提供无法支持外部请求。
虽然Minor GC一般回收时间会比较短,但是Full GC会导致较长时间的服务停顿,尤其是在old内存区比较大的话尤其会更长。

CMS并非不暂停,而是采用两次短暂停。他分为如下几个阶段
- 初始标记(STW initial mark)
- 并发标记(Concurrent marking)
- 并发预清理(Concurrent precleaning)
- 重新标记(STW remark)
- 并发清理(Concurrent sweeping)
- 并发重置(Concurrent reset)
其中初始标记和重新标记需要暂停用户线程,也叫STW(Stop-The-World)。

收集周期见图一




参数配置:

启用CMS:-XX:+UseConcMarkSweepGC。

开启CMS阶段进行合并碎片选项:-XX:+UseCMSCompactAtFullCollection。由于cms整个过程中不会进行整理、压缩堆空间,造成内存碎片而增加Full GC的次数,但是开启该选项会影响性能。

CMS回收线程:使用-XX:+UseParNewGC选项来开启。ParNew是Serial的并行版本,可以指定GC线程数,默认GC线程数为CPU的数量。可以使用-XX:ParallelGCThreads选项指定GC的线程数。

设置old区GC触发条件:默认CMS是在tenured generation占满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:-XX:CMSInitiatingOccupancyFraction=80

最后贴上58内部用的jvm参数部分配置:

-XX:ParallelGCThreads=20

-XX:+UseConcMarkSweepGC

-XX:+UseParNewGC

-XX:+UseCMSCompactAtFullCollection

-XX:CMSInitiatingOccupancyFraction=80
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: