2017-06-19 49 views
0

我有一個程序,它從磁盤上讀取許多文件(混合PDF通常低於10 MB + Kb的XML大小),並將它們一次上傳到舊版系統中。週末時,我讓它在visualvm下運行,今天早上我回到了一個圖表,顯示在程序運行的小時內,堆的使用情況非常不均勻。我期望隨着時間的推移,堆的使用量大致相當。瞭解visualvm的堆圖

heap graph from visualvm showing an uneven heap pressure over time

我尋找這個解釋。這是在Ubuntu 17.04(桌面,非服務器)下的64位Oracle JVM,在4核i5-2400(無超線程)上具有32 GB RAM。該程序基本上是單線程的,利用了核心的大約50%,並花了預期的時間運行。

我明白,如果內存沒有完全使用,它會隨着時間的推移而被釋放。我不明白隨着時間的推移,使用量會下降,因爲負載應該是相當均勻分佈的。我看到系統閒置時CPU節流的結果嗎?某些JVM優化是否在踢?

回答

2

實際的GC日誌會更有幫助,但可能只是GC啓發式方法調整他們關於年輕堆棧大小和老堆大小的決策,以滿足吞吐量和暫停時間目標。

只要您不對JVM設置限制,它就會高興地使用比最低限度更多的內存來保持程序運行。如果沒有,你會遇到非常頻繁和低效的GC。換句話說,堆大小= n *實際對象集大小n> 1.根據使用的收集器,除了可用內存以外,n可能沒有上限,因爲在G1使用70時,ParallelGC默認MaxHeapFreeRatio到100。

啓發式方法遠非完美,它們可以將自己繪製在某些邊緣情況下的角落,或在不同平衡點之間不必要地波動。但圖表本身並不表示有問題。

+0

我不認爲這是一個問題。我正試圖瞭解事物的異常情況(以及爲什麼)能夠識別他們何時不再正常。這是使用JVM的所有默認設置。如果它能得到任何有用的信息,我可以在以後運行gc日誌記錄。你有鏈接到討論這些GC啓發式的好資源嗎? –

+0

[tag:garbage-collection]標籤[wiki](https://stackoverflow.com/tags/garbage-collection/info)有鏈接到一些資源 – the8472