2013-03-07 96 views
2

我正在使用Oracle 1.7.0_10 VM來運行我正在運行的高性能Java應用程序。我花了很多時間在HPROF分析器上查看內存分配情況,因爲它正在執行大量的GC(通過-verbose:gc output測量)。現在,我的配置很少,但GC仍然運行頻繁,工作量很少,需要很長時間。例如,這裏的一些輸出我得到了不使用特殊的GC選項(-verbose:gc -XX:+PrintGCDetails -Xmx4g):爲什麼垃圾回收器繼續在JDK 1.7中運行?

[GC [PSYoungGen: 21197K->96K(1228224K)] 420220K->399118K(2045440K), 0.0081950 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

[Full GC (System) [PSYoungGen: 96K->0K(1228224K)] [ParOldGen: 399022K->394779K(817216K)] 399118K->394779K(2045440K) [PSPermGen: 10758K->10758K(21248K)], 0.1503380 secs] [Times: user=0.89 sys=0.00, real=0.15 secs] 

[GC [PSYoungGen: 21195K->128K(1238592K)] 415974K->394907K(2055808K), 0.0061850 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

[Full GC (System) [PSYoungGen: 128K->0K(1238592K)] [ParOldGen: 394779K->394779K(817216K)] 394907K->394779K(2055808K) [PSPermGen: 10758K->10758K(21248K)], 0.2534350 secs] [Times: user=1.71 sys=0.01, real=0.25 secs] 

這些通用的消息時2.5秒掛鐘時間重複做10次 - 根據他們的大致250毫秒計時,這是所有的進程似乎在這段時間內(我明白它可能會在另一個線程上做一些工作)。令我困惑的是,似乎沒有太多工作要做。看看這些信息,所有這些年代似乎都有足夠的空間 - 楊爲21Mb-> 0,但分配了1.2G,老一代的規模幾乎沒有變化,遠低於門檻。

鑑於此,爲什麼GC會頻繁運行?而且它似乎也沒有反正它應該需要250毫秒的核心i7上沒有別的運行來清理這麼小的內存。

我試過其他GC參數,但沒有一個似乎有影響。不幸的是,由於我的應用程序使用了1.7個特定功能,因此我無法在其他虛擬機中運行。

回答

6

鑑於此,GC爲何頻繁運行?

「全GC (系統)」通常表明你的應用程序已經明確要求垃圾收集致電Runtime.getRuntime().gc()System.gc()來運行。

因此,您可能需要仔細檢查您的代碼。

而且,看Does java garbage collection log entry "Full GC (System)" mean some class called System.gc()?

+0

非常感謝 - 我用相當多的內部圖書館,事實證明他們中的一個有一個的System.gc()。刪除後,額外的GC呼叫消失,我的運行時間下降30%。 – user2144429 2013-03-07 14:35:49

+1

您可以使用-XX:+ DisableExplicitGC讓JVM忽略System.gc() – 2013-03-08 16:19:16