一尘不染

Java堆术语:young, old and permanent generations?

java

我试图了解Java堆术语中的年轻,老年和永久一代的概念,更具体地说是三代之间的交互。
我的问题是:

  • What is the young generation?
  • What is the old generation?
  • What is the permanent generation?
  • How does the three generations interact/relate to each other?

阅读 408

收藏
2020-03-12

共1个答案

一尘不染

这似乎是一种常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是用于类定义和相关数据的单独空间。在Java 6和更早版本中,实习生字符串也存储在永久代中。在Java 7中,插入的字符串存储在主对象堆中。

这是永久世代的好帖子。

我喜欢Oracle 关于JConsole的指南中对每个空间的描述:

对于HotSpot Java VM,用于串行垃圾回收的内存池如下。

  • Eden Space (heap):最初为大多数对象分配内存的池。
  • Survivor Space (heap):包含在Eden空间的垃圾回收中幸存的对象的池。
  • Tenured Generation (heap):包含幸存者空间中已有一段时间的对象的池。
  • Permanent Generation (non-heap):包含虚拟机本身所有反射数据的池,例如类和方法对象。对于使用类数据共享的Java VM,这一代被分为只读和读写区域。
  • Code Cache (non-heap):HotSpot Java VM还包括代码缓存,其中包含用于编译和存储本机代码的内存。

Java使用分代垃圾回收。这意味着,如果你有一个对象foo(它是某个类的实例),则该对象幸存的垃圾收集事件越多(如果仍然有对其的引用),则它得到的推广就越多。它始于年轻一代(本身被划分为多个空间-伊甸园和幸存者),如果生存了足够长的时间,最终将进入终身一代。

2020-03-12