Java中的WeakReference和SoftReference都用于实现内存敏感的高速缓存,但它们之间有一些关键区别。
-
弱引用(WeakReference):
- 弱引用是一种相对较弱的引用关系,它不会阻止所引用的对象被垃圾回收器回收。
- 当垃圾回收器运行时,如果发现弱引用,它会将这些弱引用所指向的对象放入待回收的集合中,以便在下次回收时回收这些对象。
- 弱引用适用于实现内存敏感的高速缓存,例如:缓存一些不经常使用的对象,当内存不足时,可以被垃圾回收器回收。
- 弱引用不能被回收器回收,只有垃圾回收器扫描到弱引用指向的对象时,才会将对象回收。
-
软引用(SoftReference):
- 软引用是一种相对较强的引用关系,它允许所引用的对象在内存不足时被垃圾回收器回收,但在内存充足时,垃圾回收器不会回收这些对象。
- 软引用通常用于实现内存敏感的高速缓存,例如:缓存一些经常使用的对象,当内存不足时,可以被垃圾回收器回收,从而避免内存溢出。
- 软引用可以通过java.lang.ref.SoftReference类来实现。
- 软引用可以被垃圾回收器回收,只有当系统内存空间足够,垃圾回收器认为有必要回收时,才会回收软引用所指向的对象。
总结:
- 弱引用和软引用都可以用于实现内存敏感的高速缓存,但弱引用相对较弱,不能阻止对象被回收;软引用相对较强,允许对象在内存不足时被回收,但在内存充足时不会被回收。
- 弱引用不能被回收器回收,只有垃圾回收器扫描到弱引用指向的对象时,才会将对象回收;软引用可以被垃圾回收器回收,只有当系统内存空间足够,垃圾回收器认为有必要回收时,才会回收软引用所指向的对象。