CMS、G1、ZGC的堆内存实现区别

每次被问到Java的堆内存是如何细分?

很多人回答这个问题的时候,都是上来就直接说新生代和老年代,以为所有算法的内存实现都一样。

其实CMS、G1、ZGC的堆内存实现是不同的。我们可以从这三种垃圾回收器的堆内存实现更好地回答这个问题。

CMS

CMS堆内存和以往的垃圾回收器一样,分为新生代和老年代,新生代和老年代是物理隔离的。
image.png
这些space必须是地址连续的空间。

G1

G1打破了以往将收集范围固定在新生代或老年代的模式,GI 将 Java 堆空间分割成了若干相同大小的 区域,即 region,包括 Eden、Survivor、 Old、 Humongous 四种类型。其中, Humongous 是特殊的 Old 类型,专门 放置大型对象。这样的划分方式意昧着不需要一个连续的内存空间管理对象。 GI 将 空间分为多个区域,优先回收垃圾最多的 区域。 GI 采用的是 好的空间整合能力’不会产生大量的空间碎片。

Region的数值是在1M到32M字节之间的一个2的幂值数,JVM会尽量划分2048个左右、同等大小的Region。

GI 的一大优势在于可预测的停顿时间, 能够尽可能快地在指定时间内完成垃圾回收任务。在 JDK11中,已经将 GI 设为默认 垃圾回收器。
image.png

ZGC

和G1类似,但ZGC的region的大小更加灵活和动态。zgc的region不会像G1那样在一开始就被划分为固定大小的region。

zgc的region核心亮点就是:动态。

动态表现为:

  1. 动态地创建和销毁。
  2. 动态地决定region的大小。它的最小单位是2MB的一个块。然后每个region的大小就是是2MB*N就是。

而且他有个概念叫:size groups。有三种:

  • Small:就是一个2MB的region。
  • Medium:32mb。2MB*16。
  • Large:N*2MB。

整个heap长这样:
image

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值