我试图理解Java堆术语中的年轻、年老和永久代的概念,更具体地说,是这三代之间的交互。我的问题是:
q3qa4bjr1#
这似乎是一个常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是用于类定义和相关数据的单独空间。在Java 6和更早的版本中,临时字符串也存储在永久生成中。在Java 7中,临时字符串存储在主对象堆中。这是一个关于permanent generation的好帖子。我喜欢Oracle的guide on JConsole中对每个空间的描述:对于HotSpot Java VM,用于串行垃圾收集的内存池如下所示。
Java使用分代式垃圾收集。这意味着如果你有一个对象foo(某个类的示例),它存活的垃圾收集事件越多(如果仍然有对它的引用的话),它就被提升得越远。它开始于年轻的一代(它本身被分成多个空间-- Eden和Survivor),如果它存活的时间足够长,最终会在终身代结束。
s71maibg2#
堆被划分为年轻代和老代,如下所示:
年轻一代:这是一个短期居住的地方,分为两个空间:
主要区别是元空间动态调整大小,即它可以在运行时扩展。Java元空间空间:未绑定(默认)
代码缓存(虚拟或保留):如果您使用HotSpot Java VM,则这包括代码缓存区域,其中包含用于编译和存储本机代码的内存。
Courtesy
von4xj4u3#
什么是年轻一代?
什么是老一代?
什么是永久代?
现在将忽略 PermSize和MaxPermSize 参数这三代人是如何相互影响/联系的?
图片来源&甲骨文technetwork教程文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html上面文章中的“* 一般垃圾收集过程 *”用许多图表解释了它们之间的相互作用。请看汇总图:
kokeuurv4#
Java虚拟机分为三代:年轻代、老代和永久代。大多数对象最初都分配在年轻代中。老代包含经过一定次数的年轻代收集后仍然存在的对象,以及一些可以直接分配在老代中的大对象。永久代保存JVM认为便于让垃圾收集器管理的对象,例如描述类和方法的对象以及类和方法本身。
wrrgggsh5#
SunHotSpot JVM中的内存分为三代:年轻一代、年老一代和永久一代。
仅供参考:永久生成不被视为Java堆的一部分。
**这三代人如何相互作用/相互关联?**对象(大的除外)首先分配给年轻一代。如果一个对象在x个垃圾收集周期后仍然存活,它将被提升到老/终身代。因此,我们可以说年轻代包含寿命短的对象,而老代包含寿命长的对象。永生化世代不与其他两代相互作用。
5条答案
按热度按时间q3qa4bjr1#
这似乎是一个常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是用于类定义和相关数据的单独空间。在Java 6和更早的版本中,临时字符串也存储在永久生成中。在Java 7中,临时字符串存储在主对象堆中。
这是一个关于permanent generation的好帖子。
我喜欢Oracle的guide on JConsole中对每个空间的描述:
对于HotSpot Java VM,用于串行垃圾收集的内存池如下所示。
Java使用分代式垃圾收集。这意味着如果你有一个对象foo(某个类的示例),它存活的垃圾收集事件越多(如果仍然有对它的引用的话),它就被提升得越远。它开始于年轻的一代(它本身被分成多个空间-- Eden和Survivor),如果它存活的时间足够长,最终会在终身代结束。
s71maibg2#
堆被划分为年轻代和老代,如下所示:
年轻一代:这是一个短期居住的地方,分为两个空间:
老一代:此池基本上包含永久和虚拟(保留)空间,并将保存那些在从年轻代进行垃圾收集后仍存在的对象。
Permanent Generation:此内存池名称还表示包含永久类元数据和描述符信息,因此PermGen空间始终保留用于类和与类相关的类(例如静态成员)。
Java8更新:****PermGen被替换为Metaspace,这一点非常相似。
主要区别是元空间动态调整大小,即它可以在运行时扩展。
Java元空间空间:未绑定(默认)
代码缓存(虚拟或保留):如果您使用HotSpot Java VM,则这包括代码缓存区域,其中包含用于编译和存储本机代码的内存。
Courtesy
von4xj4u3#
什么是年轻一代?
什么是老一代?
什么是永久代?
现在将忽略 PermSize和MaxPermSize 参数
这三代人是如何相互影响/联系的?
图片来源&甲骨文technetwork教程文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
上面文章中的“* 一般垃圾收集过程 *”用许多图表解释了它们之间的相互作用。
请看汇总图:
kokeuurv4#
Java虚拟机分为三代:年轻代、老代和永久代。大多数对象最初都分配在年轻代中。老代包含经过一定次数的年轻代收集后仍然存在的对象,以及一些可以直接分配在老代中的大对象。永久代保存JVM认为便于让垃圾收集器管理的对象,例如描述类和方法的对象以及类和方法本身。
wrrgggsh5#
SunHotSpot JVM中的内存分为三代:年轻一代、年老一代和永久一代。
仅供参考:永久生成不被视为Java堆的一部分。
**这三代人如何相互作用/相互关联?**对象(大的除外)首先分配给年轻一代。如果一个对象在x个垃圾收集周期后仍然存活,它将被提升到老/终身代。因此,我们可以说年轻代包含寿命短的对象,而老代包含寿命长的对象。永生化世代不与其他两代相互作用。