Java 如何完全从JTabbedPane处置选项卡式窗格组件

Java 如何完全从JTabbedPane处置选项卡式窗格组件,java,swing,garbage-collection,jtabbedpane,swingx,Java,Swing,Garbage Collection,Jtabbedpane,Swingx,我已经在JTabbedPane中添加了几个选项卡。每个选项卡都包含一个JPanel。我现在通过调用JTabbedPane.remove([tab index])来删除选项卡。这将删除该选项卡,一切正常,只是当我评测应用程序时,添加到JTabbedPane的JPanel不会被“释放”,并且引用仍然存在于堆中。在添加并关闭选项卡的100次操作之后,应用程序的内存就会耗尽 我使用分析了堆转储,并单击了JPanel的直接控制者,这些控制者在关闭选项卡后不应该出现在那里。直接的主宰者以JTabbedPan

我已经在JTabbedPane中添加了几个选项卡。每个选项卡都包含一个JPanel。我现在通过调用JTabbedPane.remove([tab index])来删除选项卡。这将删除该选项卡,一切正常,只是当我评测应用程序时,添加到JTabbedPane的JPanel不会被“释放”,并且引用仍然存在于堆中。在添加并关闭选项卡的100次操作之后,应用程序的内存就会耗尽

我使用分析了堆转储,并单击了JPanel的直接控制者,这些控制者在关闭选项卡后不应该出现在那里。直接的主宰者以JTabbedPane的身份回来了

然后我写了一个SSCCE来重现这个问题,发现我无法重现这个问题。当我关闭选项卡时,JPanel确实会被释放。有什么我不知道的吗。为什么JTabbedPane在某些情况下甚至在关闭选项卡后仍保留对JPanel的引用

更新:

我仔细看了一下垫子的柱状图,发现了一些奇怪的东西

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

这是显示关闭选项卡后状态的图像。ShareholderDtlsPanel的hashcode不同..b340,它与一个完全无关的PropertyChangeListener关联。


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

“然后我写了一个SSCCE来重现这个问题,发现我无法重现这个问题。当我关闭选项卡时,JPanel确实被处理掉了。我缺少了什么东西吗?”显然,在真正的应用程序中,代码行中存在一些不同的东西。有任何线程是在真实代码中启动的吗?选项卡的内容是否依赖于其他代码?其他代码是否包含对选项卡中对象的引用?这就是我试图使用堆转储分析的内容,结果表明JPanel仅由JTabbedPane引用。如果我在JTabbedPane上调用了remove,为什么heapdump会说JTabbedPane仍然持有对它的引用?并回答其他问题。。据我所知,没有。。其他地方并没有JPanel的引用。另一个问题可能是打开的对象、填充要查看的数据的内容,比如FileIO、JDBC等等。。。。必须检查是否所有文件、流。。。。读者或结果集在finally块中关闭,顺便说一句,无法回答此问题