一、什么样的对象该回收:没有任何引用的对象。
二、怎么判断对象是否不具有引用:有两种方法,一种是引用计数算法,另外一种是可达性分析算法。
引用计数算法:对象中会有一个引用计数器,每有一个对该对象的引用就会在计数值上+1,当计数值为0的时候,该对象便不再有引用。
可达性分析算法(Java主流算法):会设置一个”GC Roots“对象,该对象可以是各种引用的对象,当一个对象没有到”GC Roots“对象的任何引用链时,那么这个对象就是可回收的;具体如下图所示(该图来自《深入理解Java虚拟机》):
三、为了使gc回收更加灵活,Java为对象分成了如下四种不同的状态:
强引用——普遍的引用类型,只要强引用还在就不会被回收(如:Object obj = new Obje(););
软引用——可有可无的对象,在内存溢出之前会被回收;
弱引用——gc运行时时就会回收的对象;
虚引用——无法通过该引用获取对象的实例,被回收时会收到一个系统通知。
四、垃圾回收算法:
标记-清除算法:顾名思义,将要回收的对象标记然后清除标记对象,其问题就是效率低下,并且会产生大量的内存碎片(内存碎片较多时可能会导致较大的对象申请不到内存空间)&#x