年轻,终身和烫发一代

2022-08-31 14:45:27

我对Heap,Young,Tenured和Perm Generation感到困惑。

任何人都可以解释一下吗?


答案 1

Java 垃圾回收器称为分代垃圾回收器。应用程序中的对象的生存时间长度不同,具体取决于它们的创建位置及其使用方式。这里的关键见解是,对短期和长期对象使用不同的垃圾回收策略,可以针对每种情况专门优化GC。

从广义上讲,当对象在年轻一代中“存活”重复的垃圾回收时,它们被迁移到终身一代永久生成是一种特殊情况,它包含 JVM 需要的对象,这些对象不一定在程序中表示,例如表示类和方法的对象。

由于年轻一代通常会包含大量垃圾,因此它经过优化,可以一次清除许多未使用的对象。永久生成,因为它包含更长寿命的对象,因此针对快速垃圾回收进行了优化,而不会浪费大量内存。

随着垃圾回收技术的改进,细节变得非常复杂,并且根据您的JVM及其配置方式而有所不同。如果您需要确切地知道发生了什么,您应该阅读您正在使用的特定JVM的文档

也就是说,有一个简单的历史安排,这在概念层面上仍然有用。从历史上看,年轻一代将是一个复制收藏家而终身一代将是一个标记和全面的收藏家复制收集器基本上不支付任何CPU成本来清除垃圾,大部分成本用于维护活动对象,这种效率的代价是更重的内存使用。标记和扫描收集器为活动对象和未使用的对象支付一些 CPU 成本,但可以更有效地利用内存。


答案 2

Java 堆内存是操作系统分配给 JVM 的内存的一部分。每当我们创建对象时,它们都是在java的堆内创建的。

Java堆空间分为三个区域或一代,用于垃圾回收,称为年轻一代,旧代或终身世代和永久世代。永久生成是在热点 JVM 中的完整 gc 期间进行垃圾回收

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

旧一代用于存储长长的幸存物体。通常,为年轻一代对象设置阈值,当达到该年龄时,该对象将移动到老一代。最终需要收集老一代。此事件称为主要垃圾回收。

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

自Java 8发布以来,PermGen已被Metaspace取代。PermSize 和 MaxPermSize 参数现在将被忽略。看看Pierre - Hugues Charbonneau的这篇dzone文章,了解Metaspace。

enter image description here

图片来源:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

有关更多详细信息,请参阅同一篇文章。


推荐