現在、アプリケーションの 1 つで発生するメモリ リークを調査しています。さらに調査した結果、ほぼ 14 時間アイドル状態にある 2 つの単純な Java Swing アプリケーションのテストを思いつきました。どちらのアプリケーションも 30 個の JButton で構成されています。
最初のアプリケーションは、アクション リスナーに強い参照を使用しています。
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
2 番目のアプリケーションは、アクション リスナーに弱参照を使用しています。
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 のバグですか? この種のメモリリークを解決するための他の選択肢は何ですか?
前もって感謝します!