2016-03-04 86 views
0

我的任務是分析垃圾收集。我已經配置了服務器以記錄GC並且統計信息正確傳遞。現在我有GC信息,我有一個關於調整的問題。將我的GC文件插入分析工具後,我發現沒有完整的GC只有次要的GC。這是一個問題嗎?
此外,如果你看一下下面的行...如何分析JVM垃圾收集?

[PSYoungGen: 454784K->14336K(450688K)] 685884K->258421K(1761408K), 8.6630322 secs] [Times: user=30.25 sys=1.20, real=8.66 secs] 

這是否意味着...。

454784K->14336K = Usage of Young generation before and after collection 

對我來說,這看起來像之前有更年輕的GC比後收藏。在這種情況下,我應該創造一個新的比例?還是我在倒退看?

685884K->258421K = Total used heap before and after collection 

此外,我運行一個JMeter測試後是具有最高的時間...

[Times: user=30.25 sys=1.20, real=8.66 secs] 

最低的時候我已經是

[Times: user=0.73 sys=0.29, real=0.16 secs] 

這是否意味着我需要關注在代碼上看看爲什麼這個特定的任務是如此之高?也許這是一個線程/數據庫問題?

我應該試着讓這些數字儘可能接近454784K-> 14336K? 我需要完整的GC嗎?

任何想法?

回答

1

這取決於你的目標是什麼。您的GC時間將根據多種因素而變化,最重要的是

  • 是執行完整的GC。
  • 有多少數據來自年輕一代。

恕我直言,提高性能的最佳方法是降低您的分配率。這將使您的代碼在GC暫停之間更快,減少GC暫停的次數,並使您的應用程序更易於調整。我建議您使用Flight Recorder來監控您的內存分配。

+0

謝謝彼得。我會考慮減少分配率。說完整的GC沒有被執行是否安全,因爲我沒有在日誌中看到任何完整的GC。只有PSYoungGen。或者,Full GC可能需要一段時間才能在日誌中顯示一兩天? –

+0

@Angular_Newbie完整的GC通常發生在終身空間填滿時。這需要多長時間取決於您的應用程序和配置。可能是幾秒鐘或幾天。你可以用'jstat -gccause {pid} 10s'來觀察GC區域,這樣你就可以看到每個區域填滿時以及GC發生的時間和原因。 –