2013-09-26 42 views
2

即使堆未完全使用,我仍然遇到重複的完整GC。重複完整GC與可用堆

這是gc日誌的樣子:http://d.pr/i/iFug(藍線是用過的堆,灰色矩形是Full GC)。

這似乎是一個類似於張貼在這個問題一個問題:Frequent full GC with empty heap

然而,該線程並沒有提供任何實際的答案的問題。我的應用程序確實使用RMI,生產服務器在升級45之前確實使用1.6,GC間隔從1分鐘增加到1小時(http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html)。但是,從日誌的其餘部分,我無法看到Full-GC-1-min模式。

這可能是什麼原因造成的?

回答

1

最有可能的原因是您已達到堆的當前大小。堆的大小小於您設置的最大值,並在程序運行時進行調整。

例如假設您設置最大1 GB,初始堆大小可能爲256 MB,並且當您達到256 MB時,它會執行完整的GC,在此GC之後,它可能會決定400 MB將會更好,並且達到等


你得到一個大集合,當終身空間滿了,或者沒有找到可用空間進行完整的GC。例如,如果它是分散的。

如果您的倖存者空間太小,您還可以獲得完整收藏。

總之,最可能的原因是您使用的gc調整參數。我建議你簡化你的調整參數,直到你的系統按你期望的方式運行。

+0

我開始使用相同的最小和最大堆的JVM,所以它不能。我很想嘗試調整GC,但不幸的是這發生在生產環境中,我可以在測試環境中重現它。 – halfwarp

0

如鏈接線程中所述,禁用顯式GC並查看FullGC模式是否再次出現:-XX:+DisableExplicitGC。 RMI代碼可能會在給定的時間間隔內觸發顯式的GC,這在某些情況下可能不合需要。

如果FullGC仍然存在,我會採用線程轉儲和可能的堆轉儲來分析問題。

另外,使用jstat看到佔領伊甸園,倖存者,OldGen空間。

+0

這可能會起作用,但副作用是什麼?我很想在測試環境中重現這一點,但我無法做到。 – halfwarp

+0

不應該有任何副作用,它被廣泛勸阻調用'System.gc()' - 這可能會損害性能,所以只建議使用'-XX:+ DisableExplicitGC'並讓GC完成工作。你基本上使用這個標誌來防止流氓庫/代碼試圖觸發顯式的GC。 –