引用分析
更多介绍:https://blog.csdn.net/m0_60907200/article/details/123776701
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关,Java 提供了四种强度不同的引用类型
强引用:被强引用关联的对象不会被回收,只有所有 GCRoots 都不通过强引用引用该对象,才能被垃圾回收
- 强引用可以直接访问目标对象
- 虚拟机宁愿抛出 OOM 异常,也不会回收强引用所指向对象
- 强引用可能导致内存泄漏
1
Object obj = new Object();//使用 new 一个新对象的方式来创建强引用
软引用(SoftReference):被软引用关联的对象只有在内存不够的情况下才会被回收
具体使用:https://blog.csdn.net/qq_37935909/article/details/109177723
- 仅(可能有强引用,一个对象可以被多个引用)有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象
- 配合引用队列来释放软引用自身,在构造软引用时,可以指定一个引用队列,当软引用对象被回收时,就会加入指定的引用队列,通过这个队列可以跟踪对象的回收情况
- 软引用通常用来实现内存敏感的缓存,比如高速缓存就有用到软引用;如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时不会耗尽内存
1
2
3Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null; // 使对象只被软引用关联弱引用(WeakReference):被弱引用关联的对象一定会被回收,只能存活到下一次垃圾回收发生之前
- 仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
- 配合引用队列来释放弱引用自身
- WeakHashMap 用来存储图片信息,可以在内存不足的时候及时回收,避免了 OOM
1
2
3Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;虚引用(PhantomReference):也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个
- 一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象
- 为对象设置虚引用的唯一目的是在于跟踪垃圾回收过程,能在这个对象被回收时收到一个系统通知
- 必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存
1
2
3Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj, null);
obj = null;终结器引用(finalization):所有的类都继承自Object类,Object类有一个finalize方法(已废弃)。当某个对象不再被其他的对象所引用时,会先将终结器引用对象放入引用队列中,然后根据终结器引用对象找到它所引用的对象,然后调用该对象的finalize方法。调用以后,该对象就可以被垃圾回收了。这个方法永远都不需要重写,而且也不应该被重写。
引用队列
软引用和弱引用可以配合引用队列
- 在软引用和弱引用所引用的对象被回收以后,会将这些引用放入引用队列中,方便一起回收这些软/弱引用对象
虚引用和终结器引用必须配合引用队列
- 虚引用和终结器引用在使用时会关联一个引用队列