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