深入理解JVM学习笔记(二十一、JVM 垃圾回收机制---如何回收垃圾---回收策略【标记-清除算法】)

        标记-清除算法是GC中最基础的算法。从名称上看,其可以拆分为两部分:标记(mark)和清除(sweep)。此算法可以分为两个阶段,一个是标记阶段,一个是清除阶段,下面就分别做一下介绍。

(1)标记阶段:

        在此阶段,垃圾回收器会从mutator(应用程序)根对象开始遍历。每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象。

(2)清除阶段:

        在此阶段中,垃圾回收器,会对堆内存从头到尾进行线性遍历,如果发现有对象没有被标识为可到达对象,那么就将此对象占用的内存回收,并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作。

图示如下:

深入理解JVM学习笔记(二十一、JVM 垃圾回收机制---如何回收垃圾---回收策略【标记-清除算法】)_第1张图片深入理解JVM学习笔记(二十一、JVM 垃圾回收机制---如何回收垃圾---回收策略【标记-清除算法】)_第2张图片

        在标记阶段,从根对象1可以访问到B,从B又可以访问到E,那么B和E都是可到达对象,同样的道理,F、G、J和K都是可到达对象。在回收阶段,所有未标记为可到达的对象都会被垃圾回收器回收。

        特别说明:在垃圾回收阶段,应用程序的执行会暂停,等待回收执行完毕后,再恢复程序的执行。

何时开始垃圾回收:

        在使用标记清除算法时,未引用对象并不会被立即回收.取而代之的做法是,垃圾对象将一直累计到内存耗尽为止.当内存耗尽时,程序将会被挂起,垃圾回收开始执行。

标记清除算法的优点:

        简单易实现;由于整个过程不移动对象,与保守式GC算法兼容(保守式GC算法不需要移动对象);

标记清除算法的缺点:

        1、垃圾收集后有可能会造成大量的内存碎片,像上面的图片所示,垃圾收集后内存中存在三个内存碎片,假设一个方格代表1个单位的内存,如果有一个对象需要占用3个内存单位的话,那么就会导致Mutator一直处于暂停状态,而Collector一直在尝试进行垃圾收集,直到Out of Memory。

    2、回收效率不高(需要进行两次内存扫描,分别是标记阶段和清除阶段);

你可能感兴趣的:(JVM)