强引用(Strong Reference):
-
强引用是 Java 中最基本的引用类型。在代码中直接创建对象时,通常使用的是强引用,例如
Object obj = new Object(); -
强引用的对象在垃圾回收器运行时不会被回收。只要强引用指向对象,这个对象就会被保留在内存中。除非显式地将
obj赋值为null或者它不再被引用 -
换句话说,只要存在强引用,垃圾回收器不会对这个对象进行回收,即使系统内存紧张。
软引用(SoftReference):
- 软引用的对象通常在内存足够时不会被回收。它们会在内存不足时成为垃圾回收的候选对象。
- 当 JVM 发现内存不足时,会优先回收软引用指向的对象,以释放内存。只有在内存非常紧张时,软引用对象才会被回收。
- 用于缓存那些在内存不足时可以回收的对象。软引用的对象会在 JVM 内存不足时优先被回收,但在内存充足时它们会被保留
弱引用(WeakReference):
- 弱引用的对象会在每次垃圾回收时被回收。即使内存充足,只要垃圾回收器运行,弱引用指向的对象都会被回收。
- 弱引用适用于那些可以被轻松重新创建或不需要长期存在的对象。
- 用于引用一些非必须的对象。这些对象在垃圾回收时会被优先回收,不管内存是否充足。弱引用适用于缓存或数据结构中临时需要的对象
虚引用(PhantomReference):
- 虚引用的对象不会直接影响其回收。虚引用只用于在对象被回收后进行清理操作。用于跟踪对象被垃圾回收的过程。虚引用的对象在被回收时不会影响其生命周期,只能在对象被回收后获得通知。它主要用于资源清理等高级场景。
- 当对象被回收时,虚引用会被加入到虚引用队列中,开发者可以通过这个队列在对象回收后进行特定的清理操作。
- 虚引用的对象不会被回收,除非它没有其他的强引用、软引用或弱引用指向它,并且垃圾回收器运行时会将其进行回收。
总结:
-
强引用:对对象的引用是最基本和最直接的,垃圾回收器不会回收被强引用指向的对象。
-
软引用的对象在内存紧张时会被回收,但在内存充足时会尽量保留。
-
弱引用的对象在每次 GC 时都会被回收。
-
虚引用的对象在 GC 时会被回收,但开发者只能在对象被回收后通过虚引用队列获得通知并进行额外处理。