我有一个应用程序,其中使用 SSL。该应用程序的重点是它将无限运行。现在的问题似乎是,随着时间的推移,我得到以下图像:
现在开始,我在 2 个点查看堆转储(使用 eclipse 的 Memory Analyzer Tool):1 当我的应用程序达到内存使用的最高点和最低点时(我假设发生了垃圾收集。 )一开始一切都很好,我的应用程序在终结器队列中有几个对象,这些对象消失了。但是半小时后,没有明显的原因,当垃圾收集发生时,对终结器类的引用并没有消失。它们的大小不断增加,并且有 10 个引用,它们指向一个对象和队列中的下一个终结器,它们不断重复出现。所以它实际上是一个重复链,对相同事物的引用,永远不会被收集。虽然这确实在一开始就被收集了。
所以我的问题实际上是 2 倍:第一个问题:这可能是什么原因突然没有被收集?(因为我已经非常仔细地查看了我的代码,我相当确定我确实关闭了终结器类引用的东西(显然,输入流和输出流。还有一些来自我正在使用的 SSL 库的抽象内容,但相当肯定那里没有什么可以关闭的。我正在使用一般的 Client.getConnectionManager().shutdown(),我认为应该清除它,它在一开始就这样做了)。可能是,当应用程序重复时自己一遍又一遍,由于某种原因,参考队列太大而收集器无法处理它?
第二个问题是:我该如何解决这个问题?您看到的图像是来自 Jconsole 的顺便说一句,当我执行手动 GC 时,这些都消失了,然后重新开始。
非常感谢任何朝着正确方向的帮助或推动。