JVM 垃圾回收器

  • JDK8默认的是Parallel Old
  • JDK9默认的是G1(Garbage First)
  • JDK11默认的是ZGC

识别垃圾的算法:

  1. 引用计数法
  2. 可达性分析

JVM 垃圾回收器_第1张图片

1、Serial

新生代垃圾收集器,采用复制算法,单线程,同时STW(Stop The World);

2、ParNew

新生代垃圾收集器,采用复制算法,是Serial的多线程版本,STW;

3、Parallel Scavenge

新生代垃圾收集器,采用复制算法,并行多线程,同时具有GC自适应的调节策略(新生代的大小、Eden与Survivor区的比例、晋升老年代对象年龄等细节参数);

4、Serial Old

是Serial的老年代版本,单线程,采用标记-整理算法,它主要有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用,另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。

5、Parallel Old

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。可以考虑将Parallel Scavenge和Parallel Old配合使用。

6、CMS

初始标记--> 并发标记 --> 重新标记-->并发清除

是一款标记-清除算法,收集结束时会有空间碎片产生,由于在垃圾收集阶段用户线程还需要运行,还需预留有足够的内存空间给用户线程使用,因此CMS需要预留一部分空间提供并发收集时的程序运作使用。如果CMS运行期间预留的内存无法满足程序需要,就会出现一次“Concurrent Mode Failure”失败,这时虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集。

如果剩余内存不足,则临时启动Serial Old,如果产生大量碎片,无法分配大块内存,则触发Full GC。

7、G1

初始标记--> 并发标记--> 最终标记--> 筛选清除

堆中的内存,是逻辑上的连续,物理上的不连续,可以自动调节新生代和老年代的比例,触发回收的阈值是基于整个堆大小。

 

你可能感兴趣的:(Java基础)