2015-07-10 63 views
0

我使用VisualVM來分析javafx 8應用程序,它執行一些繪圖並使用比我想要的更多的內存。它似乎沒有泄漏,但由於某種原因,即使我使用的堆會上下跳動,但我選擇不同的文件進行圖形繪製時,我的堆總數也不會減少。所有的尖峯都是當我繪製一個新文件,然後在退出該屏幕時退出,但是總堆只是開始並保持不變。這是正常的嗎?VisualVM堆大小沒有按照使用的大小

enter image description here

回答

5

是的,這是正常的。 JVM從操作系統分配更多的堆內存並且不會返回,但實際使用情況可能會有所不同,即堆中當前未使用的部分可能會發生變化。

其中一個原因是從操作系統中分配內存的代價有點高,數據一旦寫入就可能實際上被分割。垃圾收集可能釋放大塊內存,因此使用的大小會減少,但仍然使用的塊可能遍佈整個堆內存。我不確定JVM如何實際處理這些細節(實際上不同的JVM可能會以不同方式處理),但是您可能會查找在這種情況下使用的免費列表,夥伴系統等。

有人可能會爭辯說,JVM可以在垃圾收集之後對內存進行「碎片整理」,然後釋放過多的堆內存,但這會造成相當的性能下降,尤其是如果大量數據必須在RAM中移動甚至虛擬/交換內存。與許多計算問題一樣,這是空間和CPU使用之間的折衷。

+0

所以只要藍線不會隨着時間的推移而穩定下來,我可以考慮這個泄漏的權利?我們假設我們有漏洞,任務管理器顯示使用量持續上升,但看起來我們錯了,在穩定之前,堆只需要更多的內存。 – Mark

+0

@標記基本上是。它應該多快或應該穩定在哪裏取決於你的應用程序,但只要你沒有得到一個OutOfMemoryError它應該沒問題。請記住,出於性能方面的原因,直到垃圾收集與停止世界的收集進行時,堆的使用可能會達到(幾乎)最大值(在您的情況下爲1GB)。 – Thomas