Young , Tenured 和 Perm 一代
Posted
技术标签:
【中文标题】Young , Tenured 和 Perm 一代【英文标题】:Young , Tenured and Perm generation 【发布时间】:2011-01-05 11:04:02 【问题描述】:我对 Heap、Young、Tenured 和 Perm 一代感到困惑。
谁能解释一下?
【问题讨论】:
【参考方案1】:堆中的所有对象在被引用时仍然存在。当它们不多时,垃圾收集器 (GC) 将回收它们的内存。
PermGen、Young 和 Tenured 是对象(或堆中可能存在的空间)的不同分类。
PermGen:这些对象将一直存在,它们不会被垃圾回收。那里有类对象,实习字符串等。我不知道那里是否有GC(当系统卸载类时......但这不是正常的事情)
Young:当一个对象被创建时它就在这里。
Tenured:一个对象在经过 N 次 GC 传递后进入该分类/类别(幸存 = GC 传递,但该对象已被引用,因此无法回收)。
根据使用的 GC 和一些参数化,GC 或多或少地通过。
然后垃圾收集可以有不同的方法来管理堆中的对象。这种对象分类有助于做到这一点。
【讨论】:
如果你真的喜欢这种内存管理的东西,请阅读 Fortega 推荐的内容。【参考方案2】:Java 垃圾收集器被称为通用垃圾收集器。应用程序中的对象存在不同的时间长度,具体取决于它们的创建位置和使用方式。这里的关键见解是,对短期和长期对象使用不同的垃圾回收策略可以针对每种情况专门优化 GC。
简单地说,随着对象在年轻一代中“存活”重复的垃圾回收,它们被迁移到老一代。 永久生成是一种特殊情况,它包含 JVM 所需的对象,但不一定在您的程序中表示,例如表示类和方法的对象。
由于年轻一代中通常会包含大量垃圾,因此针对一次摆脱大量未使用的对象进行了优化。 Tenured Generation 因为它包含更长寿命的对象,所以针对快速垃圾收集进行了优化,而不会浪费大量内存。
随着垃圾收集技术的改进,细节变得相当复杂,并且取决于您的 JVM 及其配置方式。如果您需要确切地知道发生了什么,您应该阅读您正在使用的特定 JVM 的 documentation。
也就是说,有一个简单的历史安排,这在概念层面上仍然有用。从历史上看,年轻一代是copy collector,终身一代是mark and sweep collector。 复制收集器基本上不需要 CPU 成本来清除垃圾,大部分成本是维护活动对象,这种效率的代价是更重的内存使用。 标记和清除收集器会为活动对象和未使用对象支付一些 CPU 成本,但会更有效地利用内存。
【讨论】:
什么样的对象驻留在 perm 生成? 我已经澄清了关于永久代的答案。基本上,JVM 需要一些它自己的对象来管理您的应用程序这些对象通常不会直接在您的应用程序代码中使用。永久代中的对象永远不会被垃圾收集,因此得名。 @TendayiMawushe "In current generation JVMs, permgen is indeed collected like other parts of the heap"【参考方案3】:这是另一篇关于如何调整/调整 GC 参数的优秀文章(虽然很长),它可能会帮助您了解更多:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/
如果您遇到 GC 问题并且需要了解如何阅读 GC 日志,或者需要了解当前 GC 收集器的工作方式,那么这本书非常有用。
如果您想连接远程监控正在运行的系统以查看实时内存使用情况和 GC 运行情况,请查看此工具:
http://java.sun.com/performance/jvmstat/visualgc.html
【讨论】:
在您的答案中添加上述两个链接的概要将很有用,因为这些链接将来可能会被破坏。【参考方案4】:Java 堆内存 是操作系统分配给 JVM 的内存的一部分。每当我们创建对象时,它们都会在 heap in java 中创建。
Java 堆空间为了垃圾回收被分为三个区域或代,称为 年轻代、老代或永久代和永久代。永久代是热点JVM中full gc期间的垃圾收集
年轻一代是所有新对象被分配和老化的地方。当年轻代填满时,这会导致次要垃圾收集。一个充满死亡对象的年轻代很快就会被收集起来。一些幸存的对象被老化并最终移动到老年代。
老一代用于存储长期存活的对象。通常,为年轻代对象设置一个阈值,当满足该年龄时,该对象将移动到老年代。最终需要收集老年代。此事件称为重大垃圾回收。
永久生成包含 JVM 所需的元数据,用于描述应用程序中使用的类和方法。 JVM 在运行时根据应用程序使用的类填充永久代。
自 Java 8 发布以来,PermGen 已被 Metaspace 取代。 PermSize & MaxPermSize 参数现在将被忽略。看看 Pierre - Hugues Charbonneau 的 dzone article 以了解元空间。
图片来源:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
更多详情请参阅同一篇文章。
【讨论】:
excellent..我可以知道这张图片中的方法区、nativestack 和运行时常量池在哪里吗?他们持有什么? 请参阅docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html 了解更多详情。方法区是在虚拟机启动时创建的。尽管方法区在逻辑上是堆的一部分,但简单的实现可能会选择不进行垃圾收集或压缩它。每个运行时常量池都是从 Java 虚拟机的方法区分配的以上是关于Young , Tenured 和 Perm 一代的主要内容,如果未能解决你的问题,请参考以下文章