我的應用程序中存在嚴重的內存泄漏。我已經運行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
我使用目前Concurrent低暫停垃圾回收器。但是,即使在運行吞吐量收集器時,我也遇到了同樣的問題。
你知道爲什麼這些對象留在內存中嗎?你會建議做什麼?
UPDATE:內存泄漏仍會發生與Java 1.7更新1(1.7.0_01-B08,爪哇熱點(TM)64位服務器VM(構建21.1-B02,混合模式))
更新2:內存泄漏是由JConsole引起的。在JConosole啓動之前,沒有上述類的實例。一旦我通過JConsole連接到應用程序,對象就開始出現在內存中,並且它們永遠保持在那裏。在關閉JConsole之後,對象仍在內存中,並且它們的數量不斷增加,直到應用程序關閉。
有在熱點編譯器循環優化的錯誤。這可能是問題的原因。升級到1.7.1 –
GC不使用這些類。但是,監視GC的組件使用這些類來獲取有關GC的信息。 –
我猜想這些是啓用GC跟蹤的人工產物。 –