2014-06-20 29 views
2

我使用Apache節儉運行Java服務器和建檔它我發現存儲器(舊根)總是不斷增長,如由該曲線圖中:內存泄漏運行Apache服務器節儉

jconsole

尖銳因爲我點擊了「執行GC」,因此在圖表的末尾放置。

我明白這裏有內存泄漏。於是我就泄漏檢測器(MAT),並報告如下:通過「加載「com.sun.jmx.remote.internal.ArrayNotificationBuffer」 的

MAT report

一個實例」佔據7844208( 77.22%)個字節。

我從來沒有親自使用這個類,所以我認爲Apache Thrift在內部使用這個類。我也發現ArrayNotificationBuffer內存泄露this actually is an old known fixed JDK bug

所以我有一個問題,一些關於這個:

  1. 爲什麼當我點擊「執行GC」有一個在所分配的內存這樣的下跌? GC不是自動運行的嗎?爲什麼它不會垃圾收集這些內存呢?

  2. 我用的OpenJDK(7u55-2.4.7-1ubuntu1〜0.12.04.2)和as far as I can see有關ArrayNotificationBuffer所有的錯誤都已經陳舊和固定的,那麼,爲什麼會出現這種情況?如何解決它?

+0

快速搜索在Thrift源文件中沒有發現ArrayNotificationBuffer。 – JensG

+0

@JensG我認爲我錯了,JMX本質上是由JVM使用的。 – m0skit0

回答

1

運行GC()時清除分配的事實意味着最終將釋放的合法內存塊。如果你的堆很大,並且其他分配請求不會失敗,那麼老一代可能會被推遲一段時間。

至於緩衝區,我會推測一個JMX通知監聽器已經註冊,但沒有及時處理髮出的通知,但很難說。

+0

好吧,我明白解放老人可能會延遲,但延遲近2天?做什麼的?什麼用途是過時的對象?任何想法如何解決JMX泄漏? – m0skit0

+0

在我看來,一個70 MB的舊版本是相當普通的,除非你運行的是嚴重的資源有限的環境。 [server] JVM的默認堆空間通常在1GB區域,所以我不認爲這是一個異常狀態。 – Nicholas

+0

是的,對,堆是1 GiB。好的,我明白了,謝謝,JMX怎麼樣?我認爲JMX是JVM的,而不是Thrift的,但我不知道如何配置或禁用此... – m0skit0