Appearance
了解Java的第一个垃圾回收器
当年轻代Eden满时,会触发YoungGC
- 垃圾收集器先把所有工作线程挂起,所有工作线进入安全点SafePoint后, 当前处于STW状态。
- GC线程采用复制算法,把eden区的存活对象复制到survivor区,survivor的对象年龄> 15或survivor满了,复制到old区,最后清空eden
- 当GC线程执行结束后,工作线程被唤醒,继续处于running状态。
以上原理就是Serial垃圾回收器,由于工作方式是单线程串行回收,因此只适合单核CPU的场景下,早起的客户端使用的就是Serial,现在基本用不到了。
第二代ParNew垃圾回收器
在第一代的基础上引入多线程,回收时使用多线程并行回收,也就是GC线程有多个,在性能设计上尽量减少响应时间。
适用于多核CPU的环境,且需要与用户交互的程序(例如桌面端游戏)的年轻代收集器,相关参数如下:
-XX:+UseParNewGC
:启用ParNew垃圾回收器。-XX:ParallelGCThreads
:设置并行垃圾回收线程的数量。默认情况下,ParNew垃圾回收器使用与CPU核心数相同的线程数。
第三代Parallel垃圾回收器
Parallel它和ParNew回收-样,唯一的区别就是性能设计采用了高吞吐量,它是基于标记-压缩的垃圾回收算法。与前两代垃圾回收器相比,G1垃圾回收器在处理垃圾回收时更加高效,并且它不需要额外的内存。G1垃圾回收器是Java虚拟机中的默认垃圾回收器,它在Java 9及更高版本中默认启用。
它适用于多核多CPU环境下,服务器的高并发,但是与用户交互不如ParNew响应快。
-XX:+UseParallelGC
表示年轻代使用Parallel垃圾回收器。