[TOC]
Serial 垃圾收集器
Serial 是单线程垃圾回收器, 当须要执行垃圾回收时, 程序会暂停所有工作, 而后单线程执行垃圾回收.
单线程的益处就是缩小上下文切换, 缩小零碎开销. 然而这种形式的毛病也很显著, 在 GC 的过程中, 会暂停程序执行. 若 GC 产生不频繁能够选这个. 对于新声代来说, 区域比拟小, 进展工夫短.
长处
- 简略高效,是 Client 模式下默认的垃圾收集器;
- 对于资源受限的环境,比方单核(例如 Docker 中设置单核),单线程效率较高;
- 内存小于一两百兆的桌面程序中,交互无限,则无限的 STW 是能够承受的。
毛病:
- 垃圾回收速度较慢且回收能力无限,频繁的 STW 会导致较差的应用体验。
利用场景
- 是 HotSpot 在 Client 模式下默认的新生代垃圾收集器
- 在用户的桌面利用场景中,可用内存个别不大(几十 M 至一两百 M),能够在较短时间内实现垃圾收集(几十 MS 至一百多 MS), 只有不频繁产生,这是能够承受的
ParNew 垃圾收集器
ParNew 同样用于新生代, 是 Serial 的多线程版本, 并且在参数, 算法 (同样的复制算法) 和 Serial 雷同.
Par 是 Parallel 的缩写, 多线程的意思, 然而这里的多线程仅仅指垃圾收集多线程并行, 并不是垃圾收集和程序并行运行.ParNew 也须要暂停所有工作, 而后多线程并行垃圾收集.
因为是多线程执行, 所以在多 CPU 环境下, 效率比 Serial
高, 然而在单 CPU 环境下, 因为线程切换, 反而性能比拟差.
利用场景
在 Server 模式下,ParNew 是一个十分重要的收集器, 因为除 Serial 外, 目前只有 ParNew 与 CMS 收集器配合工作.
参数
- “-XX:+UseConcMarkSweepGC”:指定应用 CMS 后,会默认应用 ParNew 作为新生代收集器;
- “-XX:+UseParNewGC”:强制指定应用 ParNew;
- “-XX:ParallelGCThreads”:指定垃圾收集的线程数量,ParNew 默认开启的收集线程与 CPU 的数量雷同;
Parallel scavenge 垃圾收集器
Parallel scavenge 是一个新生代垃圾收集器, 它是用复制算法的垃圾收集器, 又是多线程并行的垃圾收集器, 和 ParNew 相似. 吞吐量优先的垃圾收集器, 是 Java1.8 默认的新生代垃圾收集器.
次要特点
Parallel scavenge 收集器的指标是达到一个可控的吞吐量,(吞吐量 = 运行用户代码工夫 /(运行用户代码工夫 + 垃圾收集工夫))
应用场景
Parallel scavenge 收集器的高吞吐量能够最高效率的利用 CPU, 尽快的实现程序的运算工作, 次要适宜后盾运算而不是太多交互的工作(太多交互的工作, 适宜用响应工夫优先的 CMS 垃圾收集器)
Parallel scavenge 能够准确管制吞吐量, 通过两个参数: 管制最大垃圾收集进展工夫
-XX:MaxGCPauseills
, 设置吞吐量大小-XX:GCTimeRatio
(GCTimeRatio 的默认值为 99,因而,GC 耗时的占比应为 1 /(1+99)=1%。应用参数的实践成果:GCTimeRatio 越大,吞吐量越大,GC 的总耗时越小。有可能导致单次 MinorGC 耗时变长。实用于高运算场景). 它还能够用-XX:+UseAdaptiveSizePolicy
参数进行自适应调节(GC Ergonomics), 关上后会 JVM 会依据以后的运行状况动静调整最适宜的吞吐量, 配合后面两个参数更好.