2012-08-24 99 views
8

我的問題是作爲標題,我通過搜索得到了一些知識:爲什麼JVM消耗的內存少於指定的-Xms?

  1. Linux有共享內存 How to measure actual memory usage of an application or process?

  2. JVM將預留的內存X毫秒 What does the -Xms JVM mean in reference to heap memory?

  3. 設置好的量

但還是不知道爲什麼,有的可以提供一些幫助?

這是我在Ubuntu12.04(64bit)上的測試運行| JDK 1.7.0_04。以下頂部顯示:

PID USER  PR NI VIRT RES  SHR S %CPU %MEM TIME+ COMMAND 
4067 brian  20 0 5316m **262m** 7496 S 0 3.3 0:00.30 java -**Xms4096m** -Xmx4096m Test 
4066 brian  20 0 3182m **256m** 7496 S 0 3.3 0:00.30 java -**Xms2048m** -Xmx2048m Test 
4065 brian  20 0 2114m **252m** 7492 S 0 3.2 0:00.30 java -**Xms1024m** -Xmx1024m Test 
4064 brian  20 0 1314m **76m** 7584 S 0 1.0 0:00.20 java -**Xms256m** -Xmx256m Test 
4063 brian  20 0 1180m **51m** 7608 S 0 0.7 0:00.21 java -**Xms128m** -Xmx128m Test 

回答

5

你看居民記憶 - 也就是物理內存消耗。有關更多信息,請參閱here

虛擬但是,內存是應用程序使用的內存,包括換出的內存(到磁盤)。您會看到與虛擬內存以及您的-Xms設置有更密切的對應關係。

有關更多信息,請參閱this ServerFault answer

+0

正要問「爲什麼交換使用,即使我的記憶豐富」。並從你所附的網址得到答案......謝謝! –

+0

那麼什麼時候RES內存會長大xms?我有一個xms和xmx = 6g的進度,在啓動後,RES是4g,一天之後它是5.9g,但是當我轉儲堆時,它只有3.9g。那麼,即使內存中使用的對象不需要那麼多,jvm會在需要xms時繼續消耗內存。 – Jaskey

3

當您的JVM啓動時,它會在啓動時將最大堆大小保留爲一個連續的虛擬內存塊。但是,只有實際使用的頁面成爲常駐頁面(實際主內存)

設置最小大小時,如果JVM不需要它,則不會強制JVM使用那麼多的內存。相反,直到現在還不需要太多的努力來減少內存(你可能還會看到一些小的集合)。在大多數應用程序中,幾乎立即達到最小大小,但是無論您設置多大,「hello world」程序都會使用相同的內存最小尺寸是。

+0

所以你的意思是,如果我設置xms = xmx = 6g,大部分時間gc都不會觸發,即使我只有4g可到達的對象? – Jaskey