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

我试图理解Java堆术语中年轻,老年和永久代的概念,更具体地说是三代人之间的相互作用。

我的问题是:

  • 年轻一代是什么?
  • 老一代是什么?
  • 永久的一代是什么?
  • 三代人如何互相交流/相互关联?

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

    这是永久一代的好帖子。

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

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

  • Eden空间(堆):最初为大多数对象分配内存的池。
  • 幸存者空间(堆):包含在伊甸园空间的垃圾收集中存活的对象的池。
  • Tenured Generation(heap):包含在遗属空间中存在一段时间的对象的池。
  • 永久生成(非堆):包含虚拟机本身的所有反射数据(例如类和方法对象)的池。 对于使用类数据共享的Java虚拟机,这一代分为只读和读写区域。
  • 代码缓存(非堆):HotSpot Java VM还包含代码缓存,其中包含用于编译和存储本机代码的内存。
  • Java使用分代垃圾收集。 这意味着如果你有一个对象foo(它是某个类的一个实例),它存活的垃圾收集事件就越多(如果仍然有引用的话),它就会被提升。 它始于年轻一代(本身分为多个空间 - 伊甸园和幸存者),如果能够长期存活下来,它们最终会成为终身的一代。


    堆分为如下的年轻和老一代:

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

  • Eden空间:使用在此空间上分配的新关键字内存创建的对象。
  • 幸存者空间(Survivor Space):这是包含从Eden空间收集java垃圾收集后存活的对象的池。
  • 老一代 :这个游泳池基本上包含了终身和虚拟(预留)空间,并将持有年轻一代垃圾收集后存活的那些物体。

  • 终身空间:这个内存池包含多个垃圾收集装置后幸存下来的对象,这些对象在从幸存者空间收集垃圾后存活。
  • 永久生成:这个内存池也称为包含永久类的元数据和描述符信息,因此PermGen空间总是为类保留的,并且这些类与例如静态成员的类绑定。

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

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

    在这里输入图像描述

    礼貌


    年轻一代是什么?

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

    老一代是什么?

    旧一代用于存放长期存活的物体。 典型地,为年轻一代的对象设置阈值,并且当该年龄被满足时,该对象被移动到老一代。 最终老一代需要收集。 这个事件被称为主要垃圾收集

    永久的一代是什么?

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

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

    PermSize和MaxPermSize参数现在将被忽略

    三代人如何互相交流/相互关联?

    在这里输入图像描述

    Image source&oracle technetwork教程文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

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

    看看汇总图:

    链接地址: http://www.djcxy.com/p/82837.html

    上一篇: Java heap terminology: young, old and permanent generations?

    下一篇: What exactly is dynamic memory?