2014-07-11 87 views
1

我正在做一個快速實驗,看看我的算法的內存性能如何。 輸入約爲2 Mb,算法運行約需1秒。 我運行這個循環500次,以便能夠查看內存分配。Java堆內存使用增加

這是JConsole的是如何顯示內存使用情況:

enter image description here

正如你可以看到堆內存使用量的增加(有點呈指數級)每兩次GC開始之前(即使輸入是一樣的)。

有沒有人知道這是否是預期的,爲什麼會發生?這是由JVM完成的一些優化嗎?

謝謝!

+0

閱讀http://docs.oracle.com/cd/E19900-01/819-4742/abeik/index.html – user1071777

+0

它看起來像你的算法需要更多的時間來運行。你確定你正在運行相同數量的迭代嗎? – JohnnyAW

+1

@JigarJoshi如果你看一下GC之後的內存,你可以看到沒有內存泄漏(至少不是一個大的內存泄漏) –

回答

3

有誰知道這是否是預期的,爲什麼會發生?這是由JVM完成的一些優化嗎?

JVM正在嘗試將花費的時間降到最低。如果你使用更多的內存,它不需要經常使用GC。

泄漏?

如果你看一下GC之後的內存使用情況,它很明顯是相同的,所以它沒有內存泄漏。或者至少不是一個大的。

您必須查看完整GC後使用的內存以確認存在內存泄漏,並且我認爲這些是次要集合。

+0

你是對的,但是在同一算法的不同迭代中設置的相同數據會導致內存突然出現可疑+1 –

+0

@JigarJoshi JVM將逐步改變GC參數。它試圖不改變它們太突然,所以幾何增加並不令人驚訝。發現它可以增加,雙打它,發現它可以增加,雙打等。 –

+0

謝謝彼得。這是有道理的,完全符合這裏發生的事情。我也使用YourKit並確認沒有內存泄漏。只是很多HashMap對象被創建。 順便說一句,你可以解釋(或指向我的文檔)如何調整GC參數?爲什麼「使用更多內存=> GC不經常」? – N3da