如果我错了,请随时纠正我。在JVM堆中,有两代,老的和年轻的。在做full GC的时候,老年代会有一些繁重的操作,比如紧空间、补洞等,会导致JVM挂掉。而且我发现在年轻代中,应用了轻量级GC,并且从我的搜索结果中还有另一个名为Eden的区域涉及年轻代。但是,查了很多文档,对于年轻代GC还是有两个困惑,
最佳答案
这是您必须记住和理解的唯一、最重要的图表:
(来源:oracle.com)
它来自 Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning ,一站式了解 GC 内部的一切。但要解决您的直接问题:
使用 new
分配新对象运算符 ( almost ) 总是发生在 Eden 空间中。但伊甸园实际上是一个堆栈。当您创建需要 N 个字节的新对象时,单个指针在该堆栈上前进 N 个字节,仅此而已。分配就是那么快,不需要搜索空闲位置,压缩等等。
当然,这个堆栈不是无限的,在某个时候我们会到达它的尽头,触发次要 GC。也很可能多个对象已经是垃圾。那么JVM在minor GC中的作用如下:
0
)在随后的小集合中,还有额外的步骤:
那么对象如何以年老代结束呢?第一个年轻对象被复制到幸存者空间之一。然后他们一次又一次地复制到另一个。一旦给定的对象来回跳跃太多次(可配置,默认为 8),它就会被提升到终身空间。
当终身空间已满时,主要 GC 运行。
关于garbage-collection - 年轻代中的JVM垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13660871/