如何判断对象死亡
一、引用计数法:设置一个程序计数器,如果被引用则加一,如果没被引用就是没用的对象
二、可达性分析:从GC Roots出发,如果某个对象没有任何到GC Roots的引用链则会被判断为被回收对象。
GC Roots:
1.虚拟机栈中的引用对象
2.方法区中的静态属性引用的对象或者常量引用对象
3.java虚拟机内部的引用对象,比如基本类型的对应的class
4.被同步锁持有的对象
三、引用
1.强引用:obj o=new obj()类型
2.软引用:还有用但是非必须的对象,在发生内存溢出之前会把这些引用回收掉
3.弱引用:软引用破产版,不管内存够不够,下次回收时候都会被回收
4.虚引用:一个对象的虚引用不会对对象本身有影响,为了能在这个对象被回收的时候收到一个系统的通知。
四、死亡或者生存?
一个对象即使被判定为不可达对象也不是会非被回收不可,要真正被宣布死亡会经过两次标记:1.gc roots可达性分析没有发现引用链被标为回收对象,随后进行一次筛选,条件是看此对象有没有必要执行finalize()方法,再次此间如果重新建立连接,则逃出生天。如果对象没有覆盖此方法,或者此方法被调用过了,则被视为不用执行finalize()方法。
五、方法区的回收
1.常量的回收
2.不再使用的类型
六、垃圾收集算法
1.标记-清除算法
问题:如果要清除很多大内存的对象,效率会很低,会产生很多内存碎片
2.标记-复制算法
问题:如果内存中存活很多大内存对象,复制对象花销大
3.标记-整理算法
七、经典垃圾收集器
1.serial收集器:单线程处理,进行垃圾收集的时候必须暂停
2.CMS收集器:初始标记,并发标记,重新标记,并发清除
3.G1收集器:初始标记,并发标记,最终标记,筛选分析