多个JFrames应用程序+垃圾收集器问题

时间:2015-04-15 12:40:06

标签: java swing garbage-collection jframe

让我们考虑在运行期间打开和关闭许多帧的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

1 个答案:

答案 0 :(得分:0)

嗯......有帮助的是:

frame.removeAll()

处理之前。但这只是部分解决方案,因为它从堆中删除了帧,但它没有删除此帧的任何原型子...

现在,visualvm说这些孩子是从被移除框架中的布局中引用的。这很奇怪。