背景
所以我读到,Swing应用程序中的内存泄漏通常源于各种侦听器(鼠标,键,焦点等)的使用.本质上,因为您将对象注册为侦听器而忘记取消注册该对象,通知程序最终会保留对象的引用,并泄漏一些内存.
我知道我们的应用程序并没有取消注册听众,并对潜在的解决方案进行了一些研究:
我发现处理问题的一种方法是使用WeakReference,可以在这里找到关于swing侦听器的方法的完整细节.
然后,我开始对NetBeans表单编辑器如何在监听器添加到表单后生成代码进行清理并发现NetBeans通过包装对象注册侦听器(即
argTypeComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
argTypeComboBoxItemStateChanged(evt);
}
});
Run Code Online (Sandbox Code Playgroud)
但生成的代码似乎并没有通过调用来清理removeItemListener.
问题
包装对象是否像弱引用一样?对我来说,它看起来可能会泄漏少量内存(包装对象的大小)?
在处理侦听器时,您是否有其他方法确保在完成侦听后始终收集垃圾?
我正在学习并尝试从本教程中用Java 实现观察者模式。我被困在我是否应该使用WeakReference主题来容纳观察者的问题上。
对于下面的实现, theSubject和 theBinaryObserver相互持有强引用,我担心这会阻止 GC 收集未使用的Subject.
所以我的问题是,我应该使用List<WeakReference<Observer>> observers而不是List<Observer> observers吗?
主题.java
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
Run Code Online (Sandbox Code Playgroud)
观察者.java
public abstract class Observer { …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,我在其中使用改进库来调用Web服务.在调用web-service后,回调返回Response然后我将响应传递给下一个活动.我想知道最好的方法.
我是记忆相关问题的新手,如果我完全错了,请纠正我.
我应该创建一个新类,然后将弱引用传递给该类,并在主活动上调用该类中的函数.
我将在事件总线上注册一个新事件,当回调返回对象时,触发事件并调用该函数.
请考虑避免内存泄漏的好处.