年轻,终身和烫发一代

Ton*_*ony 61 java garbage-collection jvm heap-memory

我对Heap,Young,Tenured和Perm一代感到困惑.

有人可以解释一下吗?

Ten*_*she 72

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

松散地说,随着物体在" 年轻一代 "中重复进行垃圾收集"生存",它们将迁移到Tenured Generation.该永久代是一个特例,它包含对象,是由JVM需要的,这不一定是在你的程序来表示,代表的类和方法的示例对象.

由于Young Generation通常会包含大量垃圾,因此它被优化用于一次性清除大量未使用的对象.在年老代,因为它包含长住对象为迅速垃圾回收不浪费大量的内存进行了优化.

随着垃圾收集技术的改进,细节变得非常复杂,并且取决于您的JVM及其配置方式.如果您需要确切知道发生了什么,您应该阅读您正在使用的特定JVM 的文档.

也就是说,有一个简单的历史安排,这在概念层面仍然有用.从历史上看,年轻一代将是一个副本收藏家,Tenured Generation是一个标记和扫描收集器.一个副本收集基本支付摆脱垃圾没有CPU成本,大部分的成本是保持活动对象,这种效率的价格是较重的内存使用情况.一个标记和清除收集支付一些CPU成本现场和未使用的对象,但更有效地利用内存.

  • @TendayiMawushe ["在当前一代JVM中,permgen确实像堆的其他部分一样被收集"](http://stackoverflow.com/questions/3796427/in-java-is-permanent-generation-space-garbage-collected) (2认同)

Rav*_*abu 28

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

Java堆空间被分为三个区域或为了垃圾收集而生成,称为Young Generation,Old或Tenured Generation和Permanent Generation.永久生成在热点JVM中的完整gc期间被垃圾收集

年轻一代是所有新对象分配和老化.当年轻一代填满时,这会导致轻微的垃圾收集.很快就会收集到充满死亡物体的年轻一代.一些幸存的物体会老化并最终移动到老一代.

老一代用来存储长期生存的对象.通常,为年轻代对象设置阈值,并且当满足该年龄时,对象被移动到旧代.最终需要收集老一代.此事件称为主要垃圾回收.

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

自Java 8发布以来, PermGen已被 Metaspace取代.PermSize和MaxPermSize参数现在将被忽略.看看这个 dzone文章皮埃尔-雨果夏博诺都懂元空间.

在此输入图像描述

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

有关详细信息,请参阅同一篇文章.


hel*_*ios 7

堆中的所有对象在被引用时都会存在.当他们不再多时,垃圾收集器(GC)将回收他们的记忆.

PermGen,Young和Tenured是对象(或堆中的空间)的不同分类.

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

Young:当一个物体被创造时,就在这里.

Tenured:当一个对象在N GC传递中幸存时,它会进入这个分类/类别(幸存= GC传递,但这个对象被引用,因此无法回收).

根据使用的GC和一些参数化,GC或多或少经常通过.

然后垃圾收集可以有不同的方法来填充堆中的对象.对象的这种分类有助于实现它.