我目前正在调查我们的一个应用程序中的内存泄漏。经过进一步调查,我想出了两个简单的 java swing 应用程序的测试,它们闲置了将近 14 个小时。这两个应用程序都包含 30 个 JButton。
第一个应用程序对其动作侦听器使用强引用:
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
第二个应用程序对其动作侦听器使用弱引用:
jButton1.addActionListener(new WeakActionListener(new MyActionListener(), this.jButton1))
这是 WeakActionListener 的实现:
public class WeakActionListener implements ActionListener {
private WeakReference weakListenerReference;
private Object source;
public WeakActionListener(ActionListener listener, Object source) {
this.weakListenerReference = new WeakReference(listener);
this.source = source;
}
public void actionPerformed(ActionEvent actionEvent) {
ActionListener actionListener = (ActionListener) this.weakListenerReference.get();
if(actionListener == null) {
this.removeListener();
} else {
actionListener.actionPerformed(actionEvent);
}
}
private void removeListener() {
try {
Method method = source.getClass().getMethod("removeActionListener", new Class[] {ActionListener.class});
method.invoke(source, new Object[] {this});
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
我使用 JConsole 对这两个应用程序进行了 14 小时的概要分析。我只是让他们在那个时间范围内闲置。它表明,无论是使用弱引用还是强引用,这两个应用程序的内存堆消耗都会随着时间的推移而增加。
我的问题是,这是 Java Swing API 中的错误吗?解决这种内存泄漏的其他选择是什么?
提前致谢!