相关疑难解决方法(0)

如何解决swing监听器内存泄漏?

背景

所以我读到,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 swing memory-leaks listeners

9
推荐指数
1
解决办法
7088
查看次数

我们应该在观察者模式中使用 Wea​​kReference 吗?

我正在学习并尝试从本教程中用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)

java design-patterns

5
推荐指数
1
解决办法
1429
查看次数

弱引用vs eventbus以避免内存泄漏android?

我正在开发一个应用程序,我在其中使用改进库来调用Web服务.在调用web-service后,回调返回Response然后我将响应传递给下一个活动.我想知道最好的方法.

我是记忆相关问题的新手,如果我完全错了,请纠正我.

我应该创建一个新类,然后将弱引用传递给该类,并在主活动上调用该类中的函数.

要么

我将在事件总线上注册一个新事件,当回调返回对象时,触发事件并调用该函数.

请考虑避免内存泄漏的好处.

android memory-leaks design-patterns callback heap-memory

2
推荐指数
1
解决办法
1077
查看次数