Java堆术语:年轻,年老和永久的世代?
2022-08-31 04:52:30
我试图理解Java堆术语中年轻,年老和永久世代的概念是什么,更具体地说是三代人之间的相互作用。
我的问题是:
- 什么是年轻一代?
- 什么是老一辈?
- 什么是永久一代?
- 这三代人如何相互作用/相互关系?
我试图理解Java堆术语中年轻,年老和永久世代的概念是什么,更具体地说是三代人之间的相互作用。
我的问题是:
这似乎是一个常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是类定义和相关数据的单独空间。在 Java 6 及更早版本中,滞留字符串也存储在永久生成中。在 Java 7 中,暂存字符串存储在主对象堆中。
这是一篇关于永久生成的好文章。
我喜欢Oracle关于JConsole的指南中对每个空间的描述:
对于 HotSpot Java VM,用于串行垃圾回收的内存池如下所示。
- 伊甸园空间(堆):最初为大多数对象分配内存的池。
- 幸存者空间(堆):包含在伊甸园空间的垃圾回收中幸存下来的物体的池。
- 终身世代(堆):包含幸存者空间中已存在一段时间的对象的池。
- 永久生成(非堆):包含虚拟机本身的所有反射数据(如类和方法对象)的池。对于使用类数据共享的 Java VM,这一代分为只读和读写区域。
- 代码缓存(非堆):HotSpot Java VM 还包括一个代码缓存,其中包含用于编译和存储本机代码的内存。
Java使用代际垃圾回收。这意味着,如果你有一个对象 foo(它是某个类的一个实例),它存活的垃圾回收事件越多(如果仍然有对它的引用),它就会得到进一步的提升。它始于年轻一代(它本身分为多个空间 - 伊甸园和幸存者),如果它存活足够长的时间,最终将最终成为终身一代。
堆分为年轻和老一代如下:
年轻一代:它是短暂居住的地方,分为两个空间:
老一代 :这个池基本上包含终身制和虚拟(保留)空间,并将保存那些在年轻一代垃圾回收后幸存下来的对象。
永久世代 :这个内存池的名称还表示包含永久的类元数据和描述符信息,因此PermGen空间始终保留给类以及与类相关的类,例如静态成员。
Java8更新:PermGen被Metaspace取代,这是非常相似的。
主要区别在于Metaspace动态调整大小,即它可以在运行时扩展。
Java 元空间空间:无界(缺省)
代码缓存(虚拟或保留):如果您使用的是 HotSpot Java VM,则包括包含内存的代码缓存区域,这些内存将用于编译和存储本机代码。