JVM之年轻代收集器详解
【摘要】 一、前言继续上一篇博文《JVM进阶(八):Stop The World》所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程。如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低。因此我们在必要的时候需要对虚拟机进行调优,调优的主要目标之一就是降低STW的时间,也就是减少Full GC的次数。那么这里我们从调优的角度来分析各个收集器的优势与不足。 二...
一、前言
继续上一篇博文《JVM进阶(八):Stop The World》所讲的,STW
即GC
时候的停顿时间,他会暂停我们程序中的所有线程。如果STW
所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低。
因此我们在必要的时候需要对虚拟机进行调优,调优的主要目标之一就是降低STW
的时间,也就是减少Full GC
的次数。那么这里我们从调优的角度来分析各个收集器的优势与不足。
二、收集器
首先从作用于年轻代的收集器开始(采用复制的收集算法):
- Serial收集器:一个单线程收集器,在进行回收的时候,必须暂停其他所有的工作线程,直到收集结束。缺点:因为要完全暂停线程,所以用户体验不佳。但是由于新生代回收得较快,所以停顿的时间非常少,而且没有线程切换的开销,因此也简单高效。通过-
XX:+UseSerialGC
参数启用。- ParNew收集器:这个是Serial收集器的多线程版本,适用于多核
CPU
的设备。但对于单核的设备来说,需要进行线程之间的切换,效率反而没有单线程的高。通过-XX:ParallelGCThreads
参数限制收集的线程数,-XX:+UseParNewGC
参数启用。- Parallel Scavenge收集器:该收集器是
JVM
默认年轻代收集器。他的关注点和其他的收集器不同,其他的关注点是尽可能的缩短Full GC
的时间。而该收集器关注的是一个可控的吞吐量。吞吐量=运行代码的时间/(运行代码的时间+GC的时间),通过参数-XX:MaxGCPauseMillis
设置最大GC
的停顿时间和-XX:GCTimeRatio
设置吞吐量的大小。通过-XX:+UseParallelGC
参数启用。主要适合在后台运算而不需要太多交互的任务。
另外,可以通过-XX:+UseAdaptiveSizePolicy
参数开启自适应调节策略,这样可以免去我们自己设置堆内存的一些细节参数,比如新生代内存大小,Eden
与Survivor
之间的比例等等。这个参数适合对内存手工优化存在困难的时候使用,他能监控系统当前的状态,通过动态调整以达到最大的吞吐量。
这里我们大概了解了下年轻代的收集器,下面一张图给大家总结一下:
三、拓展阅读
- 《JVM专栏》
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)