首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >年轻的、终身的和永久的一代

年轻的、终身的和永久的一代
EN

Stack Overflow用户
提问于 2010-01-15 18:22:31
回答 4查看 51.2K关注 0票数 66

我对堆、年轻、终身和Perm一代人感到困惑。

有谁能解释一下吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-15 19:10:33

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

松散地说,当对象在年轻一代的重复垃圾回收中“幸存下来”时,它们被迁移到永久一代。Permanent Generation是一个特例,它包含JVM需要的对象,这些对象不一定在您的程序中表示,例如表示类和方法的对象。

由于年轻一代通常会包含大量垃圾,它被优化为一次删除大量未使用的对象。由于它包含寿命更长的对象,因此针对快速垃圾收集进行了优化,而不会浪费大量内存。

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

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

票数 75
EN

Stack Overflow用户

发布于 2015-11-30 16:39:26

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

为了进行垃圾回收,Java Heap space被划分为三个区域或世代,称为年轻世代、老或永久世代和永久世代。在hotspot JVM中,永久生成是在完全gc期间进行垃圾回收的

年轻一代是对所有新对象进行分配和老化的位置。当年轻一代被填满时,这会导致较小的垃圾收集。充满死亡物体的年轻一代被非常迅速地收集起来。一些幸存下来的物体会老化,最终会转移到老一代。

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

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

自Java8发布以来,PermGen已经被Metaspace所取代。现在将忽略PermSize和MaxPermSize参数。看看这个Pierre - Hugues Charbonneau的dzone article,了解一下Metspace.

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

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

票数 34
EN

Stack Overflow用户

发布于 2010-01-15 18:34:14

堆中的所有对象在被引用时都会存活。当内存不足时,垃圾收集器(GC)将回收它们的内存。

PermGen、Young和Tenured是对象的不同分类(或堆中它们可能所在的空间)。

PermGen:这些对象将一直存在,它们不会被垃圾回收。我不知道那里是否有GC (当系统UNloads类...但这不是一件正常的事情)

Young:当一个对象被创建时,它就在这里。

存留期限:当一个对象通过N次GC测试(= GC测试,但是这个对象被引用了,所以它不能被回收)时,它就会被归入这个分类/类别。

根据所使用的GC和一些参数化,GC或多或少会通过。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2070791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档