2010-08-17 19 views
0

我有XMX在Linux上運行的Java應用程序設置爲1200M的Java在Linux上 - RES VS totalMemory()

當我檢查在TOP的過程中,我看到這樣的數字: VIRT =1412米 RES =237米 SHR =58米

Java應用程序裏面,我打印調用Runtime.getRuntime()totalMemory()每分鐘有多少顯示:

totalMemory()= 108M

爲什麼小號RES和totalMemory()的值有很大差異?

我的理解(這可能是錯誤的) - totalMemory()是現在在堆中使用的內存。 RES - 進程使用的實際RAM內存。

作爲更新: 是的,我希望RES> totalMemory() - 但這裏的差別是237MB - 108MB = 129MB。所以如果有人問我,我的Java應用程序可以使用的最大內存是多少,它應該是1200MB +「某事」 - 問題是如何知道「某事」......是150MB? 200MB? 300MB?

回答

0

RES可能會包含JVM加載的共享庫的大小,其中許多可能也會被加載用於其他應用程序(例如C運行時庫),因此不會真正計算實際的內存使用量的JVM,但被認爲是其駐留內存映像的一部分。

pstop的結果的實際解釋可能更好地指向superuser.org或serverfault.org。

0

totalMemory只是一個最大堆大小,Java進程包含Java堆和其他例如永久區域,所以RES的大小總是比java堆大。

+0

是的,我期望RES> totalMemory() - 但這裏的差別是237MB - 108MB = 129MB。所以如果有人問我,我的Java應用程序可以使用的最大內存是多少,它應該是1200MB +「某事」 - 問題是如何知道「某事」......是150MB? 200MB? 300MB? – sunny8107 2010-08-17 18:42:26

+0

它可以設置Heap和永久區域的最大尺寸,如果內存足夠,它不受限制。 Someting就像永久的(可以設置),代碼生成,GC,JNI分配memonry等。 您可以參考這裏: http://www.slideshare.net/gengmao/inside-the-jvm-memory-management-and-troubleshooting 它可以幫助你。 – Mercy 2010-08-18 01:53:33