Java堆术语:年轻的,老的和永久的世代?
我试图理解Java堆术语中年轻,老年和永久代的概念,更具体地说是三代人之间的相互作用。
我的问题是:
这似乎是一个常见的误解。 在Oracle的JVM中,永久代不是堆的一部分。 它是类定义和相关数据的独立空间。 在Java 6及更早版本中,interned字符串也存储在永久代中。 在Java 7中,interned字符串存储在主对象堆中。
这是永久一代的好帖子。
我喜欢JConsole的Oracle指南中给出的每个空间的描述:
对于HotSpot Java VM,用于串行垃圾回收的内存池如下所示。
Java使用分代垃圾收集。 这意味着如果你有一个对象foo(它是某个类的一个实例),它存活的垃圾收集事件就越多(如果仍然有引用的话),它就会被提升。 它始于年轻一代(本身分为多个空间 - 伊甸园和幸存者),如果能够长期存活下来,它们最终会成为终身的一代。
堆分为如下的年轻和老一代:
年轻一代 :这是短暂居住的地方,分为两个空间:
老一代 :这个游泳池基本上包含了终身和虚拟(预留)空间,并将持有年轻一代垃圾收集后存活的那些物体。
永久生成:这个内存池也称为包含永久类的元数据和描述符信息,因此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?