我正在尝试追踪为什么我的对象MyData没有被垃圾收集,我看到的一个问题是JPopupMenu,其中包含几个包含对MyData实例的引用的Actions,尚未收集(由VisualVM验证。
应该如何/何时清除?
我有这个:
private void mousePressEventFired(MouseEvent e) {
JPopupMenu popup = new JPopupMenu();
controller.customizePopupForObject(popup,null,null,
selectedNode.getUserObject());
popup.show(e.getComponent(),e.getX(),e.getY());
}
我从这个样本中删除了我为调用customizePopupForObject
所做的工作。 customizePopupForObject
包含许多看起来像这样的行:
popup.add(new MyDataAction1(myData,this,false));
我在OSX上使用Java 1.7.0_79。我开始将弹出项目中的所有引用设置为WeakReferences,但我不确定它是如何工作的。
我尝试添加这个:
popup.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(
PopupMenuEvent e) {
}
@Override
public void popupMenuWillBecomeInvisible(
PopupMenuEvent e) {
((JPopupMenu) e.getSource()).removeAll();
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
}
});
但这似乎不是正确的方法。
稍微相关......即使我不想删除我的数据,弹出窗口对我来说也有点奇怪。如果我在项目不同的地方触发它,我可以看到它在视觉上闪烁 - 第一个图像是弹出窗口,然后它会更新到它应该是什么。