我的应用程序中有大量内存泄漏。我已经运行了jmap,它说当前不存在以下对象(并且是泄漏的主要来源):

java.lang.management.MemoryUsage - 3938500 instances, 189048000 bytes
[Ljava.lang.management.MemoryUsage - 787700 instances, 31508000 bytes
com.sun.management.GCInfo - 293850 instances, 22055600 bytes
sun.management.GCInfoCompositeData - 393850 instances, 12603200 bytes


我不直接使用这些对象。但是,垃圾收集器会使用它们。
我用:

Java version: 1.7.0-b147
VM version: Java Hotspot(TM) 64-bit Server VM (build 21.0-b17, mixed mode)
The application is run in Jetty version 7.3.1


我目前使用并发的低暂停垃圾收集器。但是,即使在运行吞吐量收集器时,我也遇到相同的问题。

您知道为什么这些对象会保留在内存中吗?您建议做什么?

更新:Java 1.7更新1(1.7.0_01-b08,Java Hotspot(TM)64位服务器VM(内部版本21.1-b02,混合模式))仍会发生内存泄漏

更新2:内存泄漏是由JConsole引起的。在启动JConosole之前,没有上述类的实例。一旦我使用JConsole连接到应用程序,对象就会开始出现在内存中,并且永远存在。关闭JConsole之后,对象仍在内存中,并且数量不断增加,直到应用程序关闭为止。

最佳答案

我还没有真正使用过jmap,但已经处理了应用程序中的内存泄漏。

您的应用程序内存不足了吗?我建议在应用程序关闭之前进行转储,将以下内容添加到您的vm args中

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp

当您的应用程序变为oom时,它将在tmp下创建一个hprof文件,您可以使用该文件来调试问题。

如果没有进行OOM,请尝试分配较低的内存,以便您可以强制执行OOM。

我使用eclipse MAT来分析此文件。很好,因为它会立即告诉您泄漏的嫌疑人。

10-07 20:25