前提:
在垃圾回收过程中,应用软件将处于一种Stop the World 的状态。在Stop the Word 状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成,如果垃圾回收时间过长,应用程序会被挂起很久,将严重影响用户体验或者系统的稳定性。为了解决这个问题,即对实时垃圾收集算法的研究直接导致增量收集算法和分区收集算法的诞生。
增量收集:
一、基本思想
如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行,每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程,依次反复,知道垃圾收集完成
总的来说,增量收集算法的基础仍是传统的标记-清除和复制算法,增量收集算法通过对线程间冲突的妥善处理,允许垃圾收集线程以分阶段的方式完成标记、清理、或复制工作
二、缺点:
使用这种方式,由于在垃圾收集回收过程中,间断性地还执行了应用程序代码,所以能减少系统的停顿时间,但是,因为线程切换和上下文转换的消耗,会是得垃圾收集回收的总体成本上升,造成系统吞吐量 下降。
分区收集:
一般来说,在相同条件下,堆空间越大,一次GC时所需要的时间越长,有关GC产生的停顿也越长。为了更好地控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理地回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿。
分代算法将按照对象的生命周期长短划分成两个部分,分区算法将整个堆空间划分成连续的不同小区间region。
每一个小区间都独立使用,独立回收,这种算法的好处是可以控制一次回收多少个小区间
分区收集图解: