HotSpot 垃圾回收算法简介

HotSpot垃圾回收机制

    分代回收
 
垃圾回收算法
    复制
        将A空间中的可达对象复制到另一块空白空间B中,然后回收A的整个空间。(必须有一块空白空间,空间利用率不是很高,但是回收快)。
    标记清除
        遍历A空间,标记其中的可达对象,然后在遍历A空间,清除其中的不可达对象。(空间利用率高,但是会产生碎片,而且需要两次遍历空间A)。
    标记清除压缩
        遍历A空间,标记可达对象,遍历A空间,将可达对象移动到A空间的开始位置,并回收不可达空间的内存。(是复制算法和标记清除法的综合体,不会产生内存碎片)。
 
垃圾收集器(1,2,3需要Stop-the-world,4的某些阶段可以和应用程序并发执行)
    1、串行收集器(单CPU执行)
        新生代:使用串行的复制算法。
        老生代:使用串行的标记清除压缩算法。
 
   2、 并行收集器
        新生代:使用复制算法的并行版本。
        老生代:不并行,使用串行版本的标记清除压缩算法。
 
   3、 并行压缩收集器
        新生代:使用复制算法的并行版本。
        老生代:使用Mark-Summary-Compact算法。(内存空间被划分为若干固定大小的region)
            Mark:先串行的mark那些在代码中能够直接被引用的对象,将这些对象分配给各个线程,然后,各个线程并行mark所有的可达对象,并更新对象所在区域的信息(Object size and location)。
            Summary:操作对象为region,不是object,首先根据region中可达对象的密度,查找dense prefix(就是一个redion),然后针对dense prefix后面的所有region,The summary phase calculates and stores the new location of the first byte of live data for each compacted region。目前串行实现。可并行,但是并行的优先级比mark和compact低。
            Compact:利用Summary中的统计信息,将可达对象向前拷贝。(并行执行)。
 
    4、并发标记清除收集器(收集器可以和应用程序并发执行)
        新生代:使用复制算法的并行版本。
        老生代:使用并发的标记清除(Concurrent Mark-Sweep  CMS)算法。
            Initial Mark:应用程序短暂挂起,串行标记那些可以在应用程序代码中被直接引用的对象。
            Concurrent Mark:通过Initial Mark中标记的对象,专门使用一个或多个线程(官方文档上默认为一个),通过Initial Mark的结果,标记所有可达的对象,线程执行的时候,应用程序不必挂起,可以和应用程序并发的执行。
            Remark:由于在Concurrent Mark阶段,应用程序在执行,可能有新的垃圾产生,此时,应用程序短暂挂起,GC启动多个线程,对那些在Concurrent Mark阶段被改变的对象,快速并行的进行重标记。
            Concurrent Sweep:并行回收垃圾对象所占用的空间,此阶段,应用程序可以和GC并发的执行,在此阶段产生的垃圾会在下次回收。
原文地址:https://www.cnblogs.com/lcycn/p/8624595.html