首页 文章

Java堆术语:年轻,古老和永久的世代?

提问于
浏览
276

我试图理解Java堆术语中 youngoldpermanent generations 的概念,更具体地说是三代之间的相互作用 .

我的问题是:

  • 年轻一代是什么?

  • 老一代是什么?

  • 什么是永久世代?

  • 三代人如何相互作用/相互联系?

8 回答

  • 160

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

    这是good post on permanent generation .

    我喜欢Oracle的guide on JConsole中给出的每个空间的描述:

    对于HotSpot Java VM,串行垃圾回收的内存池如下 . Eden Space(堆):最初为大多数对象分配内存的池 . 幸存者空间(堆):包含在伊甸园空间的垃圾收集中幸存下来的对象的池 . Tenured Generation(堆):包含在幸存者空间中存在一段时间的对象的池 . 永久生成(非堆):包含虚拟机本身的所有反射数据的池,例如类和方法对象 . 对于使用类数据共享的Java VM,这一代分为只读和读写区域 . 代码缓存(非堆):HotSpot Java VM还包括代码缓存,其中包含用于编译和存储本机代码的内存 .

    Java使用分代垃圾收集 . 这意味着如果你有一个对象foo(它是某个类的一个实例),它存活的垃圾收集事件就越多(如果仍有对它的引用),它就会被进一步提升 . 它始于年轻一代(它本身被划分为多个空间 - 伊甸园和幸存者),并且如果它存活足够长时间,它最终会在终身一代中结束 .

  • 267

    Heap分为年轻代和老代,如下:

    Young Generation :这是短期居住的地方,分为两个空间:

    • Eden Space:使用在此空间分配的新关键字内存创建对象时 .

    • 幸存者空间:这是包含从伊甸园空间收集java垃圾后幸存下来的对象的池 .

    Old Generation :这个池基本上包含终身和虚拟(保留)空间,并且将保存从Young Generation收集垃圾后幸存的那些对象 .

    • 终身空间:此内存池包含在多个垃圾收集装置后幸存的对象,这些对象在从Survivor空间收集垃圾后幸存 .

    Permanent Generation : 此内存池名称也包含永久类元数据和描述符信息,因此PermGen空间始终保留给类以及与类绑定的那些(例如静态成员) .

    Java8更新:PermGen被替换为非常相似的Metaspace . 主要区别在于Metaspace动态地重新调整大小,即它可以在运行时扩展 . Java Metaspace空间:无界(默认)

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

    enter image description here

    Courtesy

  • 3

    年轻一代是什么?

    年轻一代是所有新物品被分配和老化的地方 . 当年轻一代填满时,这会导致轻微的垃圾收集 . 很快就会收集到充满死亡物体的年轻一代 . 一些幸存的物体会老化并最终移动到老一代 .

    老一代是什么?

    旧世代用于存储长期幸存的物体 . 通常,为年轻代对象设置阈值,并且当满足该年龄时,对象被移动到旧代 . 最终需要收集老一代 . 此事件称为主要垃圾回收

    什么是永久性的一代?

    永久生成包含JVM所需的元数据,用于描述应用程序中使用的类和方法 . JVM在运行时根据应用程序使用的类填充永久代 .

    自Java 8发布以来,PermGen已被Metaspace取代 .

    PermSize和MaxPermSize参数现在将被忽略

    三代人如何相互作用/相互联系?

    enter image description here

    图像源和oracle technetwork教程文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

    上面文章中的“一般垃圾收集过程”解释了它们与许多图表之间的相互作用 .

    看一下摘要图:

    enter image description here

  • 11

    Java虚拟机分为三代:年轻一代,老一代和永久一代 . 大多数对象最初都是在年轻一代中分配的 . 旧一代包含在一些年轻代集合中存活的对象,以及可能直接在旧代中分配的一些大对象 . 永久生成保存JVM方便垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身 .

  • 14

    This article是一个关于垃圾收集器的非常好的调查 . 它定义了垃圾收集的基本概念和术语,并包含许多解释性图纸 . 对于任何对自动内存分配如何工作感兴趣的人来说,这是一个"must read";阅读它将使您更容易阅读和理解其他人指出的各种文件 .

    (该文件缺乏的是关于1993年后垃圾收集器研究的任何信息,特别是多核系统的整个业务 . 但是,在学习运行之前,你必须学会走路 . )

  • 0

    假设您正在讨论Sun JDK / OpenJDK,请参阅OpenJDK网站上的页面Storage Management . 底部有更多信息可以链接到更多信息 .

  • 32

    虽然它是关于调整我无法抗拒推荐这个document看看第3章,如果你喜欢深入研究 .

  • 4

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

    • Young Generation:新创建的对象分配给年轻的gen .

    • Old Generation:如果新对象请求更大的堆空间,它将直接分配给旧的gen . 在几个GC周期中幸存下来的物体也被提升为古老的物种,即古老的长寿物体 .

    • 永久生成:永久生成保存JVM方便垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身 .

    仅供参考:永久基因不被视为Java堆的一部分 .

    How does the three generations interact/relate to each other? 对象(大型对象除外)首先分配给年轻一代 . 如果一个对象在x之后仍然存活 . 垃圾收集周期,它被提升到老/终身 . 因此,我们可以说年轻的一代包含短命的物体,而旧的一代则包含长寿命的物体 . 永久性基因不与其他两代相互作用 .

相关问题