2012-08-24 46 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