我正在開發一個Java應用程序,有時會做一些繁重的工作。
當這種情況發生時,它比平時使用更多的內存,所以應用程序的分配內存空間增加了。Java - 分配的空間不減少
我的問題是爲什麼分配的空間不會減少,一旦工作完成?
使用探查器,我可以看到例如70mb被分配,但只有5mb被使用! 它看起來像分配的空間只能增長,而不是縮小。
感謝
我正在開發一個Java應用程序,有時會做一些繁重的工作。
當這種情況發生時,它比平時使用更多的內存,所以應用程序的分配內存空間增加了。Java - 分配的空間不減少
我的問題是爲什麼分配的空間不會減少,一旦工作完成?
使用探查器,我可以看到例如70mb被分配,但只有5mb被使用! 它看起來像分配的空間只能增長,而不是縮小。
感謝
JVM決定何時將內存釋放回操作系統。在我使用Windows XP的經驗中,這幾乎從未發生過。有時候,當命令提示符(或Swing窗口)最小化時,我似乎回放了內存。我相信Linux上的JVM更適合返回內存。
一般可以有2個原因。
也許你的程序有內存管理問題。例如,如果您將某些對象存儲在集合中,並且絕不會從集合中移除這些對象,它們將永遠不會被垃圾收集。如果這是一個案例,你有一個應該找到並修復的錯誤。
但是可能你的代碼是確定的,但是GC仍然不會刪除那些沒有被使用的對象。其原因是GC保持自己的生活並決定自己的決定。例如,如果它認爲它有足夠的內存,它不會刪除使用的對象,直到內存使用達到某個閾值。
要確認您在這裏遇到的情況,請嘗試以編程方式或使用分析器(通常分析器具有運行GC的按鈕)調用System.gc()
。如果在強制GC運行後刪除使用的對象,則代碼無誤。否則,請嘗試找到該錯誤。您正在使用的分析器應該可以幫助您。
那麼我的對象都被刪除(不再引用),所以它不是問題。並從探查器(yourKit)運行gc只發布一點ram(大約7mb,對應於eden空間):( – jitowix 2012-08-12 11:51:08
通常,JVM在釋放已分配的內存方面非常受限制。不過,您可以將其配置爲更積極地釋放。嘗試發送這些設置到JVM當您啓動程序:
-XX:GCTimeRatio=5
-XX:AdaptiveSizeDecrementScaleFactor=1
你需要等待GC來陪伴。 – 2012-08-12 11:24:10
我試過等20分鐘,沒有任何改變。我也嘗試做一個System.gc() – jitowix 2012-08-12 11:25:49
System.gc()只是在另一個線程上調用GC。你需要讓它做到這一點。 20分鐘不做任何事情都不會打電話給GC。 GC只在需要RAM時調用,而不是在使用率變高時調用。 – 2012-08-12 11:27:07