结合此图观看
1.强引用
我们平时在用的所有的引用都属于强引用。比如,new了一个对象,同等号赋值给了一个变量,那么这个变量强引用了刚刚的对象。
强引用的特点是,只要沿着GC Root的引用,能够找到他,那么他就不会被垃圾回收。
只有所有GC Roots对象都不通过【强引用】引用该对象,该对象才能被垃圾回收。
2.软引用
在上图B对象与A2对象断开的时候,且A2对象仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象。
因为软引用也占有一定空间所以可以配合引用队列来释放软引用自身
3.弱引用
在上图B对象与A3对象断开的时候也就是仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
因为弱引用也占有一定空间所以可以配合引用队列来释放弱引用自身
4.虚引用
必须配合引用队列来使用,主要配合ByteBuffer使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存
5.终结器引用
用于实现对象的 finalize() 方法,无需手动编码,但其内部需配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Fianlizer线程通过终结器引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用对象