jvm Java堆术语:年轻的、年老的和永久的世代?

az31mfrm  于 2022-11-07  发布在  Java
关注(0)|答案(5)|浏览(173)

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

  • 什么是年轻一代?
  • 什么是老一代?
  • 什么是永久代?
  • 这三代人是如何相互影响/联系的?
q3qa4bjr

q3qa4bjr1#

这似乎是一个常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是用于类定义和相关数据的单独空间。在Java 6和更早的版本中,临时字符串也存储在永久生成中。在Java 7中,临时字符串存储在主对象堆中。
这是一个关于permanent generation的好帖子。
我喜欢Oracle的guide on JConsole中对每个空间的描述:
对于HotSpot Java VM,用于串行垃圾收集的内存池如下所示。

  • Eden空间(堆):最初为大多数对象分配内存的池。
  • 幸存空间(堆):包含在Eden空间的垃圾收集中幸存下来的对象的池。
  • 使用期生成(堆):包含已在幸存空间中存在一段时间的对象的池。
  • 永久生成(非堆):包含虚拟机本身的所有反射数据(如类和方法对象)的池。对于使用类数据共享的Java VM,此生成被分为只读和读写区域。
  • 程式码快取(非堆积):HotSpot Java VM还包括代码缓存,其中包含用于编译和存储本机代码的内存。

Java使用分代式垃圾收集。这意味着如果你有一个对象foo(某个类的示例),它存活的垃圾收集事件越多(如果仍然有对它的引用的话),它就被提升得越远。它开始于年轻的一代(它本身被分成多个空间-- Eden和Survivor),如果它存活的时间足够长,最终会在终身代结束。

s71maibg

s71maibg2#

堆被划分为年轻代和老代,如下所示:

年轻一代:这是一个短期居住的地方,分为两个空间:

    • 伊甸园(亚当和夏娃第一次生活)空间 *:当对象创建时使用new关键字在这个空间上分配内存。
    • 幸存者空间 *:这是一个包含对象的池,这些对象在从Eden空间进行java垃圾收集后仍然存在。
      老一代:此池基本上包含永久和虚拟(保留)空间,并将保存那些在从年轻代进行垃圾收集后仍存在的对象。
  • Tenured Space: 此内存池包含在多次垃圾收集后仍存在的对象,这意味着在从Survivor空间进行垃圾收集后仍存在的对象。
    Permanent Generation:此内存池名称还表示包含永久类元数据和描述符信息,因此PermGen空间始终保留用于类和与类相关的类(例如静态成员)。
    Java8更新:****PermGen被替换为
    Metaspace
    ,这一点非常相似。

主要区别是元空间动态调整大小,即它可以在运行时扩展。
Java元空间空间:未绑定(默认)

代码缓存(虚拟或保留):如果您使用HotSpot Java VM,则这包括代码缓存区域,其中包含用于编译和存储本机代码的内存。

Courtesy

von4xj4u

von4xj4u3#

什么是年轻一代?

  • 年轻代 * 是分配和老化所有新对象的位置。年轻代填满时,这会导致小垃圾收集。充满死亡对象的年轻代会很快被收集。一些幸存的对象会老化,最终移到旧代。

什么是老一代?

  • 旧代 * 用于存储存活时间长的对象。通常,会为新代对象设置阈值,当达到该年龄时,该对象将移动到旧代。最后,需要收集旧代。此事件称为 * 主要垃圾收集 *

什么是永久代?

  • 永久生成 * 包含JVM所需的元数据,用于描述应用程序中使用的类和方法。永久生成由JVM在运行时根据应用程序使用的类填充。
  • 自Java 8发布以来,PermGen已被Metaspace取代。*

现在将忽略 PermSize和MaxPermSize 参数
这三代人是如何相互影响/联系的?

图片来源&甲骨文technetwork教程文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
上面文章中的“* 一般垃圾收集过程 *”用许多图表解释了它们之间的相互作用。
请看汇总图:

kokeuurv

kokeuurv4#

Java虚拟机分为三代:年轻代、老代和永久代。大多数对象最初都分配在年轻代中。老代包含经过一定次数的年轻代收集后仍然存在的对象,以及一些可以直接分配在老代中的大对象。永久代保存JVM认为便于让垃圾收集器管理的对象,例如描述类和方法的对象以及类和方法本身。

wrrgggsh

wrrgggsh5#

SunHotSpot JVM中的内存分为三代:年轻一代、年老一代和永久一代。

  • 年轻一代:将新创建的对象分配给年轻的GEN。
  • 旧代:如果新对象请求更大的堆空间,它将被直接分配到旧代中。同样,在几个GC周期后幸存的对象将被提升到旧代中,即,长期存在的对象将存放在旧代中。
  • 永久发电:永久生成保存JVM认为便于垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身。

仅供参考:永久生成不被视为Java堆的一部分。

**这三代人如何相互作用/相互关联?**对象(大的除外)首先分配给年轻一代。如果一个对象在x个垃圾收集周期后仍然存活,它将被提升到老/终身代。因此,我们可以说年轻代包含寿命短的对象,而老代包含寿命长的对象。永生化世代不与其他两代相互作用。

相关问题