参考: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.分带收集