常用Java垃圾回收器的原理解释

29 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

GC算法(引用计数/复制/标清/标整)是内存回收的方法论,垃圾收集器就是算法落地实现。

因为目前为止还没有完美的收集器出现,更加没有万能的收集器,只是针对具体应用最合适的收集器,进行分代收集

image.png

串行垃圾回收器(Serial)

串行垃圾回收器(Serial):吃饭-收拾-吃饭(程序-gc-程序),吃饭线程中断一次再继续运行

并行垃圾回收器(Parallel)

并行垃圾回收器(Parallel):吃饭-收拾(多个清洁工)-吃饭,时间缩短

并发垃圾回收器(CMS)

并发垃圾回收器(CMS):吃饭-收拾(先去其他桌吃)-吃饭,交替进行(一边运行,一边垃圾回收)

image.png

java8之前用前三个

Java8开始用

G1

Garbage

G1垃圾回收器

G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收

①. G1(Garbage-First)是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特征

②. 在JDK1.7版本正式启用,是JDK 9以后的默认垃圾收集器,取代了CMS 回收器

①. G1是一个并行回收器,它把堆内存分割为很多不相关的区域(region物理上不连续),把堆分为2048个区域,每一个region的大小是1 - 32M不等,必须是2的整数次幂。使用不同的region可以来表示Eden、幸存者0区、幸存者1区、老年代等

②. 每次根据允许的收集时间,优先回收价值最大的Region
(每次回收完以后都有一个空闲的region,在后台维护一个优先列表)

③. 由于这种方式的侧重点在于回收垃圾最大量的区间(Region),所以我们给G1一个名字:垃圾优先(Garbage First)

④. 下面说一个问题:既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First(G1)GC?

  • 官方给G1设定的目标是在延迟可控的情况下获得尽可能高的吞吐量,所以才担当起"全功能收集器"的重任与期望。