强引用:(StrongReference)
new的对象代表强引用,强引用还在及时抛内存溢出异常也不会对其回收
软引用:(SoftReference)
在内存溢出之前会对其进行回收
弱引用:(WeakReference)
当垃圾回收到来时,不论内存是否溢出都会对其进行回收
虚引用:(PhantomReference)
无法通过该引用获得实例,仅仅作为垃圾回收时收到一个通知
回收过程:
对对象进行两次标记,如果可达性分析算法发现对象没有在GC ROOT引用链中,进行第一次标记,并筛选,如果该方法需要调用重写的finalize方法将其放入低优先级的F-Queue队列。由虚拟机自动建立的线程去执行,执行完毕后,如果在finailze方法中,对象成功拯救自己,将其进行第二次标记并移除队列。否则被回收
Finalizer与F-Queue解析
当类A重写了finalize方法时,在实例化对象时会在Object初始化中调用Finalizer.register(obj)方法,生成一个Finalizer对象持有A对象的引用(Finalizer是一个双向链表结构),GC时会判断A对象是否只有一个Finalizer对象的引用,如果是,就会将A对象放入FinalizerQueue中。Finalizer的静态代码块会实例化一条低优先级的守护线程,从FInalizerQueue中remove掉A对象,并调用runFinalizer方法(特别的,System.runFinalization方法会调用Runtime.runFinalization方法,其会回调Finalizer.runFinalization方法,该方法中会从FinalizerQueue中poll出Finalizer对象,并调用runFinalizer方法),在runFinalizer方法中,会删除Finalizer与A对象的引用并通过invokeFinalize调用A对象的finalize方法,也就解释了一个重写finalize方法的类的对象只会被调用一次,然后与FInalizer解除引用关系