jvm的垃圾回收

参考:https://www.cnblogs.com/xiaoxi/p/6486852.html

1.如何判断对象已死

  即不在被任何途径引用的对象

a.引用计数法

   每当有一个地方引用该对象时,则计数器加1,否则减1,当为-1时则表示对象已死,但是Java语言中没有用到这个算法,可以用对象的相互引用来证明

 /**
 * 虚拟机参数:-verbose:gc
 */
public class ReferenceCountingGC
{
    private Object instance = null;
    private static final int _1MB = 1024 * 1024;
    
    /** 这个成员属性唯一的作用就是占用一点内存 */
    private byte[] bigSize = new byte[2 * _1MB];
    
    public static void main(String[] args)
    {
        ReferenceCountingGC objectA = new ReferenceCountingGC();
        ReferenceCountingGC objectB = new ReferenceCountingGC();
        objectA.instance = objectB;
        objectB.instance = objectA;
        objectA = null;
        objectB = null;
        
        System.gc();
    }
}

b.根收索

以GC root为收索起点,当一个对象没有引用链时则表明对象不可用

回收过程:当对象没有引用链的时候,则会被进行第一标记和筛选(条件是没有覆盖finaliza或者该方法已被虚拟机调用过),如果判定要执行finaliza方法,会把其放到队列,然后由虚拟机自动去执行,

如何finaliza中没有成功的拯救,那么它被再次标记,表明即将回收。

3.回收算法

  a.标记回收算法:标记需要回收的对象,标记结束回收对象。效率不高且带来大量的碎片空间

  b.复制算法:把内存两块,使用其中一块来开销,当回收时,把未被回收的分配到另一块中。现代的分带回收中的新生带使用这种方法

  c.标记整理算法:前面与标记回收算法一样,但是后面不是是把所有的往一端移动。老年代使用这种算法

4.分带收集

  

 

猜你喜欢

转载自www.cnblogs.com/lvcongblog/p/10261458.html