2

我在 JTabbedPane 中添加了一些选项卡。每个选项卡都包含一个 JPanel。我现在通过调用 JTabbedPane.remove([tab index]) 来删除选项卡。这删除了选项卡,一切都很好,除了当我分析应用程序时,添加到 JTabbedPane 的 JPanel 不会“释放”并且引用仍然存在于堆中。在添加和关闭选项卡的 100 次操作后,应用程序内存不足。

我使用Eclipse MAT分析了堆转储,然后单击了关闭选项卡后不应该存在的 JPanel 的即时支配者。直接支配者作为 JTabbedPane 回来了。

于是我写了一个 SSCCE 来重现这个问题,发现我无法重现这个问题。当我关闭选项卡时,JPanel 确实被处理掉了。有什么我想念的吗。为什么即使在某些情况下关闭选项卡后,JTabbedPane 仍会保留对 JPanel 的引用?

更新:

我更详细地查看了 MAT 直方图,发现了一些奇怪的东西。

这是选项卡打开时堆转储的快照。以下是类的正确层次结构。HomeFrame 包含一个 JTabbedPane,其中包含一个 MasterDataDisplayPanel,其中包含一个 ShareholderDtlsPanel。另请注意对象 ShareholderDtlsPanel - ..a20 的哈希码。

在此处输入图像描述

这是显示关闭选项卡后状态的图像。ShareholderDtlsPanel 的哈希码不同 ..b340 并且它与完全不相关的 PropertyChangeListener 相关联。 在此处输入图像描述

有人可以帮我理解这里发生了什么吗?这可能是一个 swingx JXTaskPaneContainer 错误吗?

4

0 回答 0