分代收集器
一起七个 3 + 3 + 1
在收集器使用的时候都是:新老搭配的。
新生代收集器:
- Serial
- ParNew
- Parallel Scavenge
老年代收集器:
- CMS(Concurrent Mark Sweep)
- Serial Old
- Parallel Old
新老通吃:
G1: Garbadge First
新生代收集器
Serial GC(串行)
HotSpot运行在client模式下的默认新生代收集器。只用一个CPU/一个收集器线程去完成GC。
“Stop The World” -XX:+UseSerialGC
- 启动回收
- 暂停其他所有工作线程。新生代回收采用复制算法。
- 暂停其他所有工作线程。老年代回收采用标记整理算法。单线程收集,但是简单高效。
在内存占用不大的应用中,效率很高。
ParNew(并行)
其本质是Serial的多线程版本,目的是缩短垃圾收集的时间,也就是占用工作线程时间的问题。单CPU甚至不如Serial,但是在多核CPU配合多线程效果明显。多核CPU + 超线程技术。
若VM启用老年代使用CMS(concurrent mark sweep)时候,
参数: -XX:+UseConcMarkSweepGC
新生代次收集器默认为ParNew。
多核CPU时候一般配置为CPU核数。-XX:ParallelGCThreads=
- 启动回收
- 暂停其他所有工作线程。新生代回收采用复制算法。 (GC线程多个同时工作,并行执行)
- 暂停其他所有工作线程。老年代回收采用标记整理算法。
Parallel Scavenge
并行多线程,复制算法。关注点与ParNew不同,关注的是系统吞吐量。
系统吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾回收时间)
停顿时间越短就越适用于用户交互的程序。良好的响应速度提升用户体验。
而高吞吐则适用于后台计算而不需要太多交互的任务,可以最高效率的利用CPU时间,
尽快的完成程序的运算任务。
老年代收集器
Serial Old
- 启动回收
- 暂停其他所有工作线程。新生代回收采用复制算法。
- 暂停其他所有工作线程。老年代回收采用标记整理算法。单线程收集,但是简单高效。
在内存占用不大的应用中,效率很高。
可以与任意的新生代收集器配置使用
Parallel Old
只能配合Parallel Scavenge收集器一起使用。
CMS (并发)
Concurrent Mark Sweep,可以和用户线程同时工作。是一款并发收集器。
虽然有理论上表现更好的G1收集器,主流的仍然是CMS收集器。
能用于server模式下的JVM优化。能结合新生代的Serial 和 ParNew一起使用。
G1
Garbage-First。可以运用在新生代和老年代的直接分区收集。面向服务端的垃圾收集器。 –XX:+UseG1GC
将Java堆划分为多个相等的独立区域Region,保留新生代和老年代的概念。但是不再是物理隔离。
优化方式:
1.选择JVM版本
2.对于堆区大小的分配
3.垃圾回收的方式