如果我错了,请随时纠正我。在JVM堆中,有两代,旧的和年轻的。在进行完整的GC时,在老一代中,存在诸如紧凑空间和修复孔之类的繁重操作,这将使JVM挂起。我发现在年轻一代,应用了轻量级GC,我的搜索结果中还有另一个名为Eden的区域涉及年轻一代。然而,在搜索了很多文档后,我仍然对年轻一代的GC有两个混淆,
答案 0 :(得分:28)
这是你必须记住和理解的单一,最重要的图表:
Java memory layout http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/190244.gif
它来自Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning,一站式学习GC内部的一切。但要解决您的直接问题:
使用new
运算符(almost)分配新对象总是发生在Eden空间中。但伊甸园实际上是一堆。当您创建需要N个字节的新对象时,单个指针在该堆栈上前进N个字节,就是这样。分配是快速的,没有搜索自由点,压缩,等等。
当然这个堆栈并不是无限的,在某些时候我们会达到它的目的,触发次要的GC。也很可能多个对象已经是垃圾。那么JVM在次要GC中的作用如下:
从 GC根开始的对象的遍历图
将从GC根到达的所有对象复制到幸存者空间之一(没有间隙,我们知道所有这些,这是一个过程)
消灭伊甸园空间(基本上只是将此堆栈指针移回0
)
在随后的次要收藏中还有其他步骤:
那么对象如何以终身为代?第一个年轻物体被复制到幸存者空间之一。然后将它们一次又一次地复制到另一个。一旦给定对象来回跳转太多次(可配置,默认为8),它将被提升为终身空间。
主要GC在终身空间已满时运行。