一、对象引用类型分为哪几类?
1、强引用
- 普通变量赋值即为强引用,如A a = new A();
- 通过GC Root的引用链,如果强引用不到该对象,该对象才能被回收
2、软引用
- 例如:SoftReference a = new SoftReference(new A());
- 如果仅有软引用该对象时,首次垃圾回收不会回收该对象,如果内存仍不足,再次回收时才会释放对象
- 软引用自身需要配合引用队列来释放
- 典型例子是反射数据
3、弱引用
- 例如:WeakReference a = new WeakReference(new A());
- 如果仅有弱引用引用该对象时,只要发生垃圾回收,就会释放该对象
- 弱引用自身需要配合引用队列来释放
- 典型例子是 ThreadLocalMap 中的Entry对象
4、虚引用
- 例如:PhantomReference a = new PhantomReference(newA());
- 必须配合引用队列一起使用,当虚引用引用的对象被回收时,会将虚引用对象入队,由Reference Handler线程释放其关联的外部资源
- 典型例子是Cleaner释放DirectByteBuffer占用的直接内存