我对堆、年轻、终身和永久代感到困惑。

有人可以解释一下吗?

有帮助吗?

解决方案

Java 垃圾收集器被称为 世代垃圾收集器. 。应用程序中的对象存在不同的时间长度,具体取决于它们的创建位置和使用方式。这里的关键见解是,对短寿命和长寿命对象使用不同的垃圾收集策略可以让 GC 针对每种情况进行专门优化。

宽松地说,当对象在重复的垃圾收集中“生存”时, 年轻一代 他们被迁移到 终身教授一代. 。这 永久发电 是一种特殊情况,它包含 JVM 所需的对象,这些对象不一定在程序中表示,例如表示类和方法的对象。

自从 年轻一代 通常会包含大量垃圾,它经过优化可以一次性删除大量未使用的对象。这 终身教授一代 由于它包含寿命较长的对象,因此针对快速垃圾收集进行了优化,而不会浪费大量内存。

随着垃圾收集技术的改进,细节变得相当复杂,并且根据您的 JVM 及其配置方式而有所不同。您应该阅读 文档 如果您需要准确了解正在发生的情况,请针对您正在使用的特定 JVM。

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

其他提示

Java堆内存是由操作系统分配给JVM存储器部分。每当我们创建对象,他们在Java 堆内产生一>

<强> Java堆空间被分成三个区域或生成用于垃圾收集起见称为年轻一代,旧的或年老代和永久代。在热点JVM完整的GC期间永久生成垃圾收集

杨代 是所有新对象分配并老化。当年轻一代填满,这将导致一个小垃圾收集。年轻一代充满死亡对象的收集非常迅速。一些幸存的对象被老化,并最终移动到老一代。

旧代使用以存储长存活的对象。通常情况下,阈值设置为年轻一代的对象,当年龄被满足时,对象被移动到老一代。最终,老一代需要收集。此事件被称为主要的垃圾收集。

常驻代 包含由JVM所需的元数据来描述应用程序使用的类和方法。永久生成是由JVM在运行时基于在使用类由应用填充。

<强> PermGen的 已经替换为元空间自爪哇8释放。 PermSize&MaxPermSize参数参数现在将忽略。看看通过的皮埃尔此 dzone文章 - 雨果夏博诺了解有关元空间

图像源: http://www.oracle的.com / webfolder / technetwork /教程/ OBE / JAVA / GC01 / index.html中

请参照同一篇文章的更多细节。

被引用时,他们在堆中的所有对象生存。当它们不是多,垃圾收集器(GC)将收回他们的记忆。

的PermGen,Young和终身是对象的diferent clasifications(或在堆在那里他们可以是空格)。

PermGen的:这些对象将是永远存在的,他们不是垃圾收集。类对象是有,实习的字符串,等等。我不知道是否有GC存在(当系统卸载类......但它不是一个正常的事情)

<强>杨::当一个对象被创建它在这里

<强>终身:的对象进行到这种分类/类别时它生存ÑGC通行证(生存= GC通行证但该目的被引用,因此它不能被回收)

根据所用GC和一些参数化,通过GC或多或少常

然后垃圾收集可以有不同的方法来maange堆栈中的对象。对象的这种分类有助于做到这一点。

下面是另一个极好的(虽然长)的文章如何调整/大小的GC参数,它可以帮助你了解更多:

https://docs.oracle.com/ JavaSE的/ 8 /文档/技术说明/指南/ VM / gctuning /

一个非常有用的阅读,如果你有GC的问题和需要知道如何阅读GC日志,或者需要了解当前GC收集器是如何工作的。

如果你想连接一台正在运行的系统的远程监控看到实时的内存使用情况和GC运行检查这个工具出:

http://java.sun.com/performance/jvmstat/visualgc.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top