java堆术语:年轻、年老和永久世代?

ioekq8ef  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(430)

我试图理解java堆术语中年轻代老代永久代的概念是什么,更具体地说是三代之间的交互。
我的问题是:
年轻一代是什么?
什么是老一代?
什么是永久世代?
这三代人是如何相互影响/联系的?

wooyq4lh

wooyq4lh1#

这似乎是一个常见的误解。在oracle的jvm中,永久生成不是堆的一部分。它是用于类定义和相关数据的单独空间。在Java6和更早版本中,内部字符串也存储在永久生成中。在Java7中,内部字符串存储在主对象堆中。
这是一篇关于永久一代的好文章。
我喜欢oracle的jconsole指南中对每个空间的描述:
对于热点javavm,用于串行垃圾收集的内存池如下所示。
eden空间(heap):最初为大多数对象分配内存的池。
幸存者空间(heap):包含在eden空间的垃圾收集中幸存的对象的池。
终身生成(heap):包含幸存者空间中已经存在一段时间的对象的池。
永久生成(非堆):包含虚拟机本身的所有反射数据的池,例如类和方法对象。对于使用类数据共享的javavm,这一代被划分为只读和读写区域。
代码缓存(非堆):热点javavm还包括一个代码缓存,其中包含用于编译和存储本机代码的内存。
java使用分代垃圾收集。这意味着,如果您有一个对象foo(它是某个类的示例),它生存的垃圾收集事件越多(如果仍然有对它的引用),它得到的提升就越深。它开始于年轻一代(这一代本身被划分为多个空间——伊甸园和幸存者),如果它存活足够长的时间,最终会在终身一代结束。

cnh2zyt3

cnh2zyt32#

sunhotspot jvm中的内存分为三代:年轻一代、老一代和永久一代。
年轻一代:新创建的对象被分配给年轻一代。
旧代:如果新对象请求更大的堆空间,它会被直接分配到旧代中。同时,经过几个gc周期的对象也会被提升到旧代中,即旧代中的长寿命对象。
永久生成:永久生成保存jvm认为便于垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身。
仅供参考:永久gen不被认为是java堆的一部分。
这三代人是如何相互影响/联系的?对象(大对象除外)首先分配给年轻一代。如果一个对象在x个垃圾收集周期之后仍然是活动的,它将被提升到旧的/终身的gen。因此,我们可以说,年轻的gen包含寿命短的对象,而旧的gen包含寿命长的对象。永久世代不与其他两代人交往。

wfypjpf4

wfypjpf43#

堆分为年轻一代和老年一代,如下所示:
年轻一代:居住时间短的地方,分为两个空间:
伊甸园空间:当对象创建使用新的关键字内存分配在这个空间。
幸存者空间:这是一个池,其中包含从eden空间收集java垃圾后幸存下来的对象。
老一代:这个池基本上包含了永久的和虚拟的(保留的)空间,并将保存那些从年轻一代收集垃圾后幸存下来的对象。
永久空间:此内存池包含在多次垃圾收集后幸存的对象,表示从幸存空间垃圾收集后幸存的对象。
永久生成:这个内存池的名称还表示它包含永久的类元数据和描述符信息,所以永久生成空间总是为类和那些绑定到类(例如静态成员)的类保留的。
java 8update:permgen is 替换为非常相似的元空间。
主要区别在于元空间可以动态地重新调整大小,也就是说,它可以在运行时扩展。
java元空间:无界(默认)
代码缓存(虚拟或保留):如果您使用的是hotspot javavm,这包括代码缓存区域,其中包含用于编译和存储本机代码的内存。

礼貌

4szc88ey

4szc88ey4#

年轻一代是什么?
年轻一代是分配和老化所有新对象的地方。当年轻一代填满时,这会导致一次较小的垃圾收集。年轻一代的尸体很快就被收集起来了。一些幸存下来的物体会老化,最终移到老一代。
什么是老一代?
旧一代用于存储长期存活的对象。通常,为年轻一代对象设置一个阈值,当达到该年龄时,对象将移动到老一代。最终老一代需要被收集起来。此事件称为主要垃圾回收
什么是永久世代?
永久生成包含jvm所需的元数据,用于描述应用程序中使用的类和方法。jvm在运行时根据应用程序使用的类填充永久生成。
自从Java8发布以来,permgen已经被metaspace所取代。
permsize&maxpermsize参数现在将被忽略
这三代人是如何相互影响/联系的?

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

t98cgbkg

t98cgbkg5#

java虚拟机分为三代:年轻一代、老一代和永久一代。大多数对象最初是在年轻一代分配的。旧的一代包含在一些年轻的一代集合中幸存下来的对象,以及一些可以在旧的一代中直接分配的大型对象。永久生成保存jvm认为便于垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身。

相关问题