Java应用程序中的内存泄漏

Java应用程序中的内存泄漏,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,我有一个应用程序,其中包括使用SSL的应用程序。应用程序的要点是它将无限运行。现在的问题似乎是,随着时间的推移,我得到了以下图像: 现在,在开始时,我从两个方面看堆转储(使用eclipse中的内存分析器工具):1当我的应用程序达到内存使用的最高点和最低点时(我假设发生了垃圾收集)。在开始时,一切都很好,我的应用程序在终结器队列中有两个对象,并且这些对象都消失了。但是半小时后,由于没有明显的原因,当垃圾收集发生时,对finalizer类的引用并没有消失。它们的大小不断增加,并且有10个引用不断重

我有一个应用程序,其中包括使用SSL的应用程序。应用程序的要点是它将无限运行。现在的问题似乎是,随着时间的推移,我得到了以下图像:

现在,在开始时,我从两个方面看堆转储(使用eclipse中的内存分析器工具):1当我的应用程序达到内存使用的最高点和最低点时(我假设发生了垃圾收集)。在开始时,一切都很好,我的应用程序在终结器队列中有两个对象,并且这些对象都消失了。但是半小时后,由于没有明显的原因,当垃圾收集发生时,对finalizer类的引用并没有消失。它们的大小不断增加,并且有10个引用不断重复出现,它们指向队列中的一个对象和下一个终结器。因此,它实际上是一个重复的链,对相同事物的引用,永远不会被收集。而这在一开始确实得到了收集

因此,我的问题实际上有两个:第一个问题:是什么原因导致这些数据突然无法收集?(因为我已经非常仔细地查看了我的代码,所以我非常确定我确实关闭了终结器类引用的东西(显然是inputstreams和outputstreams)。还有一些我正在使用的SSL库中的抽象内容,但非常确定没有什么需要关闭的。我使用的是一个通用客户端。getConnectionManager().shutdown(),我想这应该会解决这个问题,它在一开始就是这样做的。)可能是,当应用程序一遍又一遍地重复自己时,由于某种原因,引用队列变得太大,收集器无法处理它吗

第二个问题是:我该如何着手解决这个问题?您看到的图像是来自Jconsole的btw,当我执行手动GC时,这些都会消失,然后重新开始


非常感谢您向正确方向提供的任何帮助或推动。

我怀疑您是否存在内存泄漏。您拥有的是一个不需要进行完整收集的垃圾收集器。这并不是为了减少程序的性质,但它确实非常小,而且您没有运行很长时间。当然,这还不足以确认是否存在内存泄漏e是泄漏

到目前为止,您看到的内存更改只是“清理”,还没有任何严重的收集。给GC一个机会来完成它的工作

通常情况下,只有在内存紧张的情况下才会发生严重的收集,因此,当堆中的各个部分都已满时,可能会发生更严重的收集。现在,您甚至还没有接近


具体地说,您已经告诉java它可以使用大约90MB的内存,而您目前只使用25MB的内存……有什么问题吗?

我怀疑您根本没有内存泄漏。您所拥有的是一个垃圾收集器,它不需要进行完全收集。这并不是为了减少程序的性质,但它确实非常小,而且您没有运行很长时间。肯定不足以确认是否有泄漏

到目前为止,您看到的内存更改只是“清理”,还没有任何严重的收集。给GC一个机会来完成它的工作

通常情况下,只有在内存紧张的情况下才会发生严重的收集,因此,当堆中的各个部分都已满时,可能会发生更严重的收集。现在,您甚至还没有接近


具体来说,您已经告诉java它可以使用大约90MB的内存,而您目前只使用25MB的内存……有什么问题吗?

这不一定是内存泄漏。我确实在连续运行数月的程序中发现了这种波动。一旦发生垃圾收集,它就会回到正常阶段。我不确定,但有时我会有一些问题即使使用探查器也会使波动剧烈。

这不一定是内存泄漏。我确实在连续运行数月的程序中发现了这种波动。一旦发生垃圾回收,它就会回到正常阶段。我不确定,但有时我看到使用探查器会使波动剧烈。

如果GC已满清除该情况并将底部内存使用量移回初始10MB,这意味着Eden空间/幸存者空间太小和/或对象升级到旧代太早(这意味着只有在发生完全GC时才会收集它们)

我建议从调整伊甸园空间和幸存者空间的大小开始

检查并查找诸如
XX:NewRatio
XX:SurvivorRatio
等调整垃圾收集的标志

另请阅读
XX:InitialTenuringThreshold
XX:MaxTenuringThreshold
-这两个定义了将对象放入旧代的阈值。如果使用得当,这两个阈值可以使您的对象在幸存者空间停留更长时间,并且在没有完全GC的情况下被收集。

mory使用回到最初的10MB,这意味着伊甸园空间/幸存者空间太小和/或对象升级到旧代太早(这意味着只有在发生完全GC时才会收集它们)

我建议从调整伊甸园空间和幸存者空间的大小开始

检查并查找诸如
XX:NewRatio
XX:SurvivorRatio
等调整垃圾收集的标志


另外请阅读
XX:InitialTenuringThreshold
XX:MaxTenuringThreshold
-这两个定义了将对象放入旧一代的阈值。如果使用得当,这两个阈值可以使您的对象在幸存者空间停留更长时间,并且在没有完全GC的情况下被收集。

当我执行手动GC时,这些都会消失,然后重新开始。
那么这不是内存泄漏,可能GC认为它有足够的内存,并且没有收集对象。
可能是吗,当应用程序重复