首先了解相关概念:
根对象(GC Root):不能被垃圾回收的对象
可达性分析算法 :Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象,扫描堆中对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到,表示可以回收
四种引用:
一.强引用:
大部分对象都是强引用,比如常见的new 出来的对象,只有所有GC Roots对象都不通过强引用引用该对象才能被垃圾回收
二.软引用(SoftReference):
只有软引用引用该对象时,在垃圾回收后,内存仍然不足时会再次发出垃圾回收,回收软引用对象
可以配合引用队列来释放软引用自身
三.弱引用(WeakReference):
只有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
可以配合引用队列来释放弱引用自身
四.虚引用(PhantomReference):
必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存
五.终结器引用:
无需手动编码但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用对象
摘自:https://www.bilibili.com/video/BV1yE411Z7AP?p=54