让我们考虑在运行期间打开和关闭许多帧的swing java应用程序。
框架可以打开,关闭,重新打开。许多不同的框架可以同时打开。
每个框架都被视为一个弹簧原型范围的bean。但似乎它在这里并不重要,因为Spring并没有管理原型范围bean的引用。
当用户关闭框架时会出现问题。关闭时会发生什么:
@Override
public void closeFrame(OurFrame frame) {
if (isFrameOpened(frame)) {
OurFrame openFrame = activeFrames.get(frame);
frame.setVisible(false);
frame.dispose();
activeFrames.remove(false);
frame = null;
}
}
activeFrames 保留所有当前打开的帧。当用户决定关闭窗口时,WindowAdapter会调用 closeFrame(...)方法。
毕竟,正如采样器所说,封闭的帧仍然挂在内存中。堆增加,如果你试图第二次打开相同的帧,应用程序会创建新的,另一个实例,仍然保留所有挂起的鬼魂。
在一天结束时,可能会有很多问题,导致问题的原因......根本没有符合垃圾收集器资格的框架。
没有明确的引用引用封闭的框架。 VisualVM说有两个指示对象:WeakReference和WeakHashMap $ Entry。
有人有任何线索吗?
此致 Dreando
答案 0 :(得分:0)
嗯......有帮助的是:
frame.removeAll()
处理之前。但这只是部分解决方案,因为它从堆中删除了帧,但它没有删除此帧的任何原型子...
现在,visualvm说这些孩子是从被移除框架中的布局中引用的。这很奇怪。