[JVM笔记].垃圾收集

75 阅读2分钟

分代收集

  1. 分代收集是针对对象的不同特征,而使用合适的算法。在新生代使用复制算法eden在8分空间,survivor在两个1分,只浪费10%的空闲空间。老年代使用标记清除/标记压缩算法清除
  2. 新生代:区域相对老年代较小,对象生命周期短、存活率低,回收频繁。
  3. 老年代:区域较大,对象生命周期长、存活率高,回收不及年轻代频繁。

增量收集

现有的算法,在垃圾回收过程中,应用软件将处于一种stop the World的状态。如果时间过长,严重影响系统的稳定性。

于是就有了增量收集的方法,基本思想是让收集线程和应用程序线程交替进行。每次,垃圾收集只在一小片区域上进行,然后切换到应用程序线程。

总的来说,其依然是使用标记-清除和复制算法,知识将线程间的冲突进行了妥善处理。

虽然在进行垃圾收集的过程中,切换到用户线程,可以减少系统停顿的时间。但是,切换线程和上下文调度,会造成垃圾回收的总成本变大,造成系统吞吐量下降。

分区收集

一般来说,在相同条件下,堆空间越大,一次GC所需要的时间就越长,有关GC产生的停顿也会越长。为了能更好地控制GC的时间,将一块大的区域分割成多个小区域,根据目标的停顿时间,合理地选择回收哪些区域,从而减少一次GC产生的停顿时间。

分代算法按照对象的生命周期,划分成长短两个部分;分区算法将堆空间划分成连续的不同小区间。

每一个小区间独立使用、独立回收。