一、什么是WeakReference
1、WeakReference是一种Java中的软引用,用于保持对对象的引用,但是不会阻止它被垃圾回收。
2、WeakReference通常用来实现缓存,在内存不足时自动释放缓存、清理无用的对象;也可以用作监视器,在对象被回收时自动从监视器中删除。
3、WeakReference被封装在java.lang.ref包中,提供了三种引用类型:WeakReference,SoftReference,PhantomReference。
public class MyObject { ... } public static void main(String[] args) { MyObject obj = new MyObject(); WeakReference weakRef = new WeakReference(obj); ... MyObject newObj = weakRef.get(); if (newObj != null) { // do something } }
二、WeakReference的使用场景
1、缓存数据
WeakReference通常被用来实现缓存,可以将需要缓存的数据存储在一个Map中,使用WeakReference作为Map中的value,保证当内存不足时自动清理无用的对象:
public class Cache { private Map<String, WeakReference
2、观察者模式
WeakReference也可以用于实现观察者模式,当对象被回收时自动从观察者列表中删除:
public interface Observer { void update(); } public class Observable { private List<WeakReference> observers = new ArrayList(); public void addObserver(Observer observer) { observers.add(new WeakReference(observer)); } public void removeObserver(Observer observer) { for (WeakReference ref : observers) { if (ref.get() == observer) { observers.remove(ref); break; } } } public void notifyObservers() { for (WeakReference ref : observers) { Observer observer = ref.get(); if (observer != null) { observer.update(); } } } } public static void main(String[] args) { Observable observable = new Observable(); ... MyObserver myObserver = new MyObserver(); observable.addObserver(myObserver); // 执行某个操作会触发notifyObservers方法 observable.doSomething(); // MyObserver不再需要被观察,可以自动从观察者列表中删除 myObserver = null; // 执行垃圾回收 System.gc(); System.runFinalization(); // 再次执行某个操作,不再触发MyObserver的update方法 observable.doSomething(); }
三、WeakReference设计注意事项
1、在使用WeakReference时需要确保弱引用指向的对象不被其他强引用持有,否则会造成对象不被回收的问题。
2、WeakReference在被垃圾回收时会进入队列中,因此如果需要在回收时进行一些额外的操作,可以使用ReferenceQueue。
3、由于WeakReference不会阻止对象被回收,因此当对象被回收后,WeakReference.get()方法将返回null,需要在代码中进行判断处理。
public static void main(String[] args) { MyObject obj = new MyObject(); ReferenceQueue queue = new ReferenceQueue(); WeakReference ref = new WeakReference(obj, queue); ... while (true) { Reference gcRef = queue.poll(); if (gcRef != null) { // 处理被GC回收的对象 ... } // do something } }
四、WeakReference的优势和劣势
1、优势:
WeakReference可以更加精细地控制内存使用,减小内存泄露的风险。
2、劣势:
WeakReference的使用会带来额外的开销,需要增加代码逻辑和维护成本。
总的来说,WeakReference是一种非常有用的Java技术,在一些场景下可以帮助我们更好地控制内存的使用,但也需要理解其优势和劣势,并合理使用。
原创文章,作者:PVIXD,如若转载,请注明出处:https://www.506064.com/n/325386.html