Skip to content

了解Java的第一个垃圾回收器

当年轻代Eden满时,会触发YoungGC

image-20230728221654322

  1. 垃圾收集器先把所有工作线程挂起,所有工作线进入安全点SafePoint后, 当前处于STW状态。
  2. GC线程采用复制算法,把eden区的存活对象复制到survivor区,survivor的对象年龄> 15或survivor满了,复制到old区,最后清空eden
  3. 当GC线程执行结束后,工作线程被唤醒,继续处于running状态。

以上原理就是Serial垃圾回收器,由于工作方式是单线程串行回收,因此只适合单核CPU的场景下,早起的客户端使用的就是Serial,现在基本用不到了。

第二代ParNew垃圾回收器

在第一代的基础上引入多线程,回收时使用多线程并行回收,也就是GC线程有多个,在性能设计上尽量减少响应时间。

适用于多核CPU的环境,且需要与用户交互的程序(例如桌面端游戏)的年轻代收集器,相关参数如下:

  1. -XX:+UseParNewGC:启用ParNew垃圾回收器。

  2. -XX:ParallelGCThreads:设置并行垃圾回收线程的数量。默认情况下,ParNew垃圾回收器使用与CPU核心数相同的线程数。

第三代Parallel垃圾回收器

Parallel它和ParNew回收-样,唯一的区别就是性能设计采用了高吞吐量,它是基于标记-压缩的垃圾回收算法。与前两代垃圾回收器相比,G1垃圾回收器在处理垃圾回收时更加高效,并且它不需要额外的内存。G1垃圾回收器是Java虚拟机中的默认垃圾回收器,它在Java 9及更高版本中默认启用。

它适用于多核多CPU环境下,服务器的高并发,但是与用户交互不如ParNew响应快。

-XX:+UseParallelGC表示年轻代使用Parallel垃圾回收器。