文章目录
新生代收生器
Serial、ParNew、Parallel、Scavenge
老年代收集器
CMS、Serial Old、Parallel Old
整堆收集器
G1
1.Serial收集器
Serial收集器是最基本的,发展历史最悠久的收集器。
特点:单线程 、简单高效(垃圾回收时会暂停其他所有工作)
应用场景: Client模式下的虚拟机
2.ParNew收集器
ParNew收集器其实就是Serial收集器的多线程版本。
特点:多线桯,默认开启的线程数和 CPU的数量相同(也会出现停顿)。
应用场景: Server模式中首选的新生代收集器.
3.Parallel Scavenge收集器
与吞吐量关系密切,故也称为吞吐量优先收集器。
特点: 属于新生代收集器也是采用复制算法的收集器,又是并行的多线程收集器 (与ParNew收集器类似)。
可控制吞吐量,有GC的自适应调节策略(收集性能检测信息,动态设置一些参数提供最优的停顿时间和最高的吞吐量)
4.Serial Old收集器
Serial Old是Serial收集器的老年代版本。
特点: 单线程,标记-整理算法。
应用场景: Client模式下的虚拟机,Server模式中也有使用。
5.Parallel Old收集器
Parallel Scavenge收集器的老年代版本。
特点: 多线程,标记-整理算法。
应用场景: 注重高吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge+Parallel Old 收集器。
6.CMS收集器
一种以获取最短回收停顿时间为目标的收集器
特点: 标记-清除算法。并发收集、低停顿。
应用场景: web程序、b/s服务。
CMS收集器的运行4步骤:
初始标记:标记GC Roots 直接关联到的对象(不会递归的追踪下去),速度快但还是有停顿。
并发标记:在GC Roots Tracing过程中进行并发标记。
重新标记:修正并发标记期间用户继续运行导致没有标记的对象。
并发清除:对标记的对象进行清除回收。
缺点: 对CUP敏感,无法处理浮动垃圾,会产生攻坚碎片。
7.G1收集器
面向服务器的垃圾收集器
特点: 引入了分区的思路,弱化了分代的概念能合理的利用周边的资源
回收流程:
初始标记:标记GC Roots 直接关联到的对象(不会递归的追踪下去),速度快但还是有停顿。
并发标记:在GC Roots Tracing过程中进行并发标记。
最终标记:修正在并发标记阶段发生变化的对象。
筛选回收:对Regin的回收成本和回收价值进行排序,根据用户期望来回收一部分的Region。
查看jvm对应的收集器,以及各个版本对应的收集器名称可以查看这篇博客
https://blog.csdn.net/youanyyou/article/details/106464291
查看自己的java使用了什么收集器
使用命令查看:
java -XX:+PrintCommandLineFlags -version
图中红框的位置就能看到对应的参数
参数和垃圾收集器对应关系
参数 | 回收器 |
---|---|
-XX:-UseSerialGC | Serial + Serial Old |
-XX:-UseParNewGC | ParNew + Serial Old |
-XX:-UseParallelGC | Parallel Scavenge + Serial Old |
-XX:-UseParallelOldGC | Parallel Scavenge + Parallel Old |
-XX:-UseConcMarkSweepGC | CMS + ParNew |
-XX:-UseG1GC | G1 |
-XX:+UseParallelGC对应的收集器问题:
对于UseParallelGC对应的收集器有两种说法:
1.Parallel Scavenge + Serial Old
2.Parallel Scavenge + Parallel Old
实际上造成有两种情况的原因是这样的,《深入理解 Java 虚拟机》第三版第 128 页中提到 JDK 9 之前,Server 默认使用 Parallel Scavenge + Serial Old 之后就是使用Parallel的。
有些网友发现在JDK9之前也有使用Parallel,准确的说 JDK 7u4 以后的 7 和 JDK 8 老年代默认使用的都是 Parallel 收集器,只是书中没有更新这个细节。
具体可以参考下面这篇博客
https://blog.csdn.net/youanyyou/article/details/106464291