Java虚拟机垃圾回收器

76 阅读4分钟

Java虚拟机垃圾回收器

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

垃圾回收算法

垃圾回收算法有:标记-清除算法、复制算法、标记-整理算法、火车算法

圾收集器

java HotSpot虚拟机中的7种垃圾收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1。

  • 新生代收集器:Serial、ParNew、Parallel Scavenge;
  • 老年代收集器:Serial Old、Parallel Old、CMS;
  • 整堆收集器:G1; 通常新生代、老年代收集器可以结合使用。

并行、并发

并行(Parallel)

指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态; 如ParNew、Parallel Scavenge、Parallel Old;

并发(Concurrent)

指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行); 用户程序在继续运行,而垃圾收集程序线程运行于另一个CPU上;

Minor GC和Full GC

Minor GC 又称新生代GC,指发生在新生代的垃圾收集动作; 特点是频繁、速度快。 Full GC老年代GC,指发生在老年代的GC;特点次数少、速度慢

Serial收集器

最早的收集器,针对新生代、采用复制算法、单线程收集。运行垃圾收收集时“Stop The World(STW)”.

相对于的Serial Old 老年代收集器。

特点:简单高效

应用场景:单CPU

ParNew收集器

新生代收集器。

ParNew垃圾收集器是Serial收集器的多线程版本。

除了多线程外,其余的行为、特点和Serial收集器一样;

通常与CMS收集器配合工作。

"-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器;

Parallel Scavenge收集器

Parallel Scavenge垃圾收集器因为与吞吐量关系密切,也称为吞吐量收集器(Throughput Collector)。

高吞吐量为目标,即减少垃圾收集时间,让用户代码获得更长的运行时间;

新生代收集器;

采用复制算法;

多线程收集;

应用场景:多CPU以计算为主,如批量处理、job等场景。

Parallel Old

是Parallel Scavenge是收集器老年代版本。

CMS收集器

并发标记清理(Concurrent Mark Sweep,CMS)

java8中应用较多的收集器,其目标是减少系统停顿时间、提高响应速度。

针对老年代采用"标记-清除"算法,缺点会产生内存碎片、有点是快。

应用场景:

多CPU,在4CPU以上更佳

与用户交互较多的场景; 如常见的BS系统。

CMS运行过程

(A)、初始标记(CMS initial mark)

仅标记一下GC Roots能直接关联到的对象; 需要"Stop The World";

(B)、并发标记(CMS concurrent mark)

进行GC Roots Tracing的过程;刚才产生的集合中标记出存活对象;

(C)、重新标记(CMS remark)

为了修正并发标记期间因用户程序继续运作而导致标记变动的那一部分对象的标记记录;

需要"Stop The World",且停顿时间比初始标记稍长,但远比并发标记短;

(D)、并发清除(CMS concurrent sweep)

回收所有的垃圾对象;

G1收集器

G1(Garbage-First)将整个堆划分为多个大小相等的独立区域(Region);新生代和老年代不再是物理隔离,而是逻辑上的多个Region。

应用场景

面向服务端应用,针对具有大内存、多处理器的机器;

最主要的应用是为需要低GC延迟,并具有大堆的应用程序提供解决方案;

ZGC

ZGC是OpenJDK11开始的收集器。基于Region采用指针着色方式标记垃圾对象。针对大堆内存、多线程并发、低延迟。

总结

垃圾收集器随时代的发展从单线程到多线程,从单核到多核,从32位内存到大堆内存,实现了不同的垃圾收集器。根据具体的使用场景可以配置使用不同的垃圾收集器。目前对于多核CPU内存在2-8G的情景下的用户交互系统使用CMS、G1收集器还是主流。

\