2010-05-28 40 views
3

我有一個Java的web服務,包含在Jetty中。我使用Sun的Java 6和默認的ParallelGC,並且打開了以下命令行選項:「-verbose:gc -XX:+ PrintGCTimeStamps --XX:+ PrintGCDetails」。爲什麼GcTimeLimit可能不會出錯?

當我的過程是內存不足,我看到loglines這樣,背到後面:

 
66872.846: [Full GC [PSYoungGen: 932534K->930686K(1865088K)] [PSOldGen: 5595037K->5595024K(5595136K)] 6527571K->6525710K(7460224K) [PSPermGen: 16488K->16487K(21504K)], 12.2488150 secs] [Times: user=12.25 sys=0.00, real=12.24 secs] 
66885.098: [Full GC [PSYoungGen: 932608K->932608K(1865088K)] [PSOldGen: 5595024K->5595024K(5595136K)] 6527632K->6527632K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 9.6745600 secs] [Times: user=9.66 sys=0.01, real=9.67 secs] 
66894.773: [Full GC [PSYoungGen: 932608K->932488K(1865088K)] [PSOldGen: 5595024K->5595023K(5595136K)] 6527632K->6527512K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 11.8445420 secs] [Times: user=11.85 sys=0.00, real=11.85 secs] 
66906.623: [Full GC [PSYoungGen: 932608K->932608K(1865088K)] [PSOldGen: 5595023K->5595023K(5595136K)] 6527631K->6527631K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 9.6006950 secs] [Times: user=9.60 sys=0.00, real=9.60 secs] 
66916.224: [Full GC [PSYoungGen: 932608K->932488K(1865088K)] [PSOldGen: 5595023K->5595023K(5595136K)] 6527631K->6527512K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 9.6498320 secs] [Times: user=9.65 sys=0.00, real=9.65 secs] 
66925.881: [Full GC [PSYoungGen: 932608K->0K(1865088K)] [PSOldGen: 5595023K->4133351K(5595136K)] 6527631K->4133351K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 6.8990990 secs] [Times: user=6.90 sys=0.00, real=6.90 secs] 

前五行似乎完全顯示垃圾收集器未能取得任何進展。根據我對JVM的理解,這應該會導致OutOfMemoryError,但我在日誌中沒有看到類似的東西。是否有可能(在JVM級別)阻止它們被拋出?或者,也許碼頭或我的應用程序抑制它們?

感謝您的諮詢!

+0

觀察 - PermSpace在21 Mb時看起來很小,根本不收集。會更好地運行128或256? – JoseK 2010-05-30 06:57:13

回答

1

嘗試顯式設置選項,或者改爲設置-XX:GCHeapFreeLimit。這些選項的文檔非常薄,並且可能不完全反映您正在運行的JVM的行爲。 (或者,也許相關選項的默認值已更改。)