【发布时间】:2012-01-03 19:19:19
【问题描述】:
我的应用程序中存在严重的内存泄漏。我运行了 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 后,对象仍在内存中,并且它们的数量还在增长,直到应用程序关闭。
【问题讨论】:
-
热点编译器循环优化存在bug。这可能是出现问题的原因。升级到 1.7.1
-
GC 不使用这些类。然而,监控 GC 的组件使用这些类来获取有关 GC 的信息。
-
我猜这些是开启 GC 跟踪的产物。
-
您是否打开了某种分析或跟踪来追踪内存泄漏?我曾经遇到过使用 hprof 代理引起的 classlaoder 泄漏。花了很长时间才发现这一点,它掩盖了最初只会偶尔出现的问题。
-
我使用的是 JConsole,它除了其他功能外还监控内存。这可能是这些对象在内存中的原因,但即使现在当 JConsole 关闭时,内存中上述对象的数量仍在增长。
标签: java memory-leaks garbage-collection