JVM系列 - 新生代垃圾收集器
Last updated: Oct 289, 28089
概要
新生代存在三个经典的垃圾收集器:
- Serial 收集器
- ParNew 收集器
- Parallel Scavenge 收集器
它们使用的垃圾收集算法都是 标记-复制
Serial
一个单线程工作的收集器
在进行垃圾收集时,必须暂停 其他所有工作线程,直到收集结束,造成 STW
是客户端模式下的默认新生代收集器
ParNew
Serial 收集器的 多线程并行版本
除了支持多线程并行收集外,与 Serial 收集器基本相同
可以与 CMS 收集器配合工作
使用 -XX:+UseConcMarkSweepGC
选项激活 CMS 后,ParNew 会成为默认的新生代垃圾收集器
使用 -XX:+/-UseParNewGC
选项可以强制指定或禁用 ParNew 收集器
使用 -XX:ParallelGCThreads
可以限制垃圾收集的线程数
注意
在 单核心处理器的环境 中,不会比 Serial 收集器有更好的效果
当使用的 处理器核数增加 时,ParNew 收集器可以提高对系统资源的使用率
Parallel Scavenge
基本与 ParNew 相同,但是关注点不同:
- 其他收集器是缩短 垃圾收集时 用户线程的停顿时间
- 达到一个可控制的吞吐量
吞吐量:处理器运行用户代码的时间 / 处理器的总消耗时间
两种场景
延迟短
适合 用户交互的场景,保证服务响应质量的程序,响应快,用户体验好
高吞吐量
最高效率地利用处理器资源,尽快完成计算任务,适合后台运算多的分析任务
三个参数
控制垃圾回收时间
-XX:MaxGCPauseMillis
设置 最大垃圾收集停顿时间
收集器会尽量保证垃圾收集时间小于设置的值
设置吞吐量
-XX:GCTimeRatio
垃圾收集时间占总时间的比率,范围 1 ~100
如果设置为 19,那么允许的最大垃圾收集时间占总时间的 1 / (1 + 19),即 5%
自适应调节策略
-XX:+UseAdaptiveSizePolicy
开启这个参数后,虚拟机会根据当前系统的运行情况
- 收集性能监控信息
- 动态调整一些参数,以提供最合适的停顿时间或最大吞吐量
动态调整的参数有:
-Xmm
:指定 新生代大小
-XX:SurvivorRatio
:Eden 与 Survivor 区的比例
-XX:PretenureSizeThreshold
:晋升老年代的对象大小