java8 中的 new generation 、young generation 和 eden space是怎样的关系?

提问的原因,是我在看官方文档时看见这三个英文是不一样
clipboard.png

我以前以为 新生代(new generation) 和 年轻代(young generation)是同一个只是翻译导致看起来不同而已,现在看起来视乎不是这样。

至于为什么会提到伊甸园(eden space),是因为在某个博客看见了下面的描述,我感觉不太对,但我对其不是特别熟
clipboard.png

阅读 5.6k
3 个回答

jdk1.8中没有永久代的概念,所以堆大小 = 年轻代 + 老年代
其中年轻代由一个 eden 和两个 survivor 组成,其中 from 和 to 的大小一样。

NGC:current new generation capacity 当前新生代的大小
EC: current eden capacity 当前 eden 的大小
YGC: number of young generation GC events。 新生代 gc 的次数。

顺路说下 young gc

  1. 绝大多数刚创建的对象会被分配在 eden 区。
  2. 当 eden 区满的时候,会发生 young gc,这时候会把存活的对象复制到一个survivor(记做 from)中,清理掉 eden 区无用的对象。
  3. 当 eden 再次满了的时候,再次发生 young gc,把存活对象复制到survivor(from) 中,如果survivor(from)也满了,则将survivor(from)中存活的对象复制到survivor(to)中。

新生代用的是复制算法 你看下复制算法是什么就知道了

clipboard.png

这是暂时我找到的官方性质的说明,该说明我是在 java version "1.8.0_211" 的jmap -heap 找到的,java version "1.8.0_181" 的 jmap -heap 也没有写 new generation。
new generation = eden + 1 Survivor Space (这里应该是指from survivor)

接下来我尝试通过计算求证一下
clipboard.png

NGC(Current new generation capacity)
S0C(Current survivor space 0 capacity)
S1C(Current survivor space 0 capacity)
EC(Current eden space capacity)

计算过程略
发现
2432.0 + 2432.0 + 19456.0 = 24320.0
S0C + S1C + EC = NGC
但是 S0C + S1C + EC 是等于年轻代的

那我暂时只能得出 jmap 的 new generation 和 jstat -gccapacity 中的不是同一个 new generation ,jstat 中的 new generation 应该是年轻代。

题外:其实刚刚说的 jmap 中的 new generation 视乎和本次的 new generation 没太大关联,不过我看见了jmap里有,就顺便拉出来说一下。jdk的文档中经常会看见 “old and new generation” 和 “tenured generation and young generation” 的写法,new generation 可能在更多地方是代指 young generation 而已。当然我暂未找到官方的说法来支持我的论点,如果有找到支持或反对我的说法,也非常欢迎提出

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题