[英]How generation help garbage collector?
我读过几篇有关垃圾回收工作原理的文章,但仍不了解使用世代有何帮助? 据我了解,主要思想是,我们从最年轻的一代开始收集产品,然后转向老一辈。 但是,为什么这个想法的作者决定从最年轻的一代开始是最有效的方法?
较老的一代意味着对象已经使用了很多次,并且可能会再次需要。 删除最近创建的对象没有任何意义,可能是其临时(作用域:本地)对象。
作者首先从最年轻的一代开始,这仅仅是因为那是您的应用程序启动后首先被填充的东西,但是实际上,哪一代正在席卷而何时不确定何时运行您的应用程序。
世代GC的重点是:
年轻一代使用复制收集器,该复制器将对象复制到它认为来自eden和当前幸存者空间为空的空间(未使用的幸存者空间),因此速度很快且GC暂停最小。
此外,大多数对象会早逝,因此从伊甸园复制少量幸存对象所需的停顿时间很小,因为仅复制具有实时引用的对象,因此伊甸园和先前的幸存者空间可以复制,因此当前的幸存者空间很小被擦拭。
在多次复制对象之后,将对象复制到保有期限(旧)的代 最终使用权的代将填满,但是,这一次没有干净的空间可将对象复制到其中,因此垃圾收集器必须在代内进行交换和压缩,这很慢(与在eden和幸存者空间)意味着更长的暂停时间。
好消息是,基于大多数启发式对象,而不是次要启发式操作,大型GC发生的频率要比次要GC发生的频率要低得多,从而使GC在应用程序生命周期内的暂停时间降至最低。
还有一个好处是,所有新对象都分配在堆的顶部,这意味着需要这样做的基本指示,在复制过程中自然会进行碎片整理。
这两个页面( Oracle垃圾收集优化和有用的JVM标志–第5部分(年轻一代垃圾收集))都对此进行了描述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.