繁体   English   中英

生成如何帮助垃圾收集器?

[英]How generation help garbage collector?

我读过几篇有关垃圾回收工作原理的文章,但仍不了解使用世代有何帮助? 据我了解,主要思想是,我们从最年轻的一代开始收集产品,然后转向老一辈。 但是,为什么这个想法的作者决定从最年轻的一代开始是最有效的方法?

较老的一代意味着对象已经使用了很多次,并且可能会再次需要。 删除最近创建的对象没有任何意义,可能是其临时(作用域:本地)对象。

作者首先从最年轻的一代开始,这仅仅是因为那是您的应用程序启动后首先被填充的东西,但是实际上,哪一代正在席卷而何时不确定何时运行您的应用程序。

世代GC的重点是:

  • 年轻一代使用复制收集器,该复制器将对象复制到它认为来自eden和当前幸存者空间为空的空间(未使用的幸存者空间),因此速度很快且GC暂停最小。

  • 此外,大多数对象会早逝,因此从伊甸园复制少量幸存对象所需的停顿时间很小,因为仅复制具有实时引用的对象,因此伊甸园和先前的幸存者空间可以复制,因此当前的幸存者空间很小被擦拭。

  • 在多次复制对象之后,将对象复制到保有期限(旧)的代 最终使用权的代将填满,但是,这一次没有干净的空间可将对象复制到其中,因此垃圾收集器必须在代内进行交换和压缩,这很慢(与在eden和幸存者空间)意味着更长的暂停时间。

  • 好消息是,基于大多数启发式对象,而不是次要启发式操作,大型GC发生的频率要比次要GC发生的频率要低得多,从而使GC在应用程序生命周期内的暂停时间降至最低。

  • 还有一个好处是,所有新对象都分配在堆的顶部,这意味着需要这样做的基本指示,在复制过程中自然会进行碎片整理。

这两个页面( Oracle垃圾收集优化有用的JVM标志–第5部分(年轻一代垃圾收集))都对此进行了描述。

阅读这一个

使用不同的世代,使对象的分配变得容易和快速,因为大多数分配都是在Heap-Eden的单个区域中完成的。 根据观察,大多数对象都死于弱代假说,年轻代中的集合具有更多的垃圾,这些垃圾将回收更多的内存,并且与堆相比,垃圾相对较小,这意味着扫描对象所需的时间也更少。 这就是为什么年轻一代GC速度快的原因。

有关GC和世代的更多详细信息,您可以参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM