views:

2113

answers:

4

Hi all,

After reading already asked question on the subject and a lot of googling I am still not able to have a clear view of -Xms option

My question is: what's the difference between java -Xms=512m -Xmx=512m and java -Xms=64m -Xmx=512m ?

For now I have the following answer:

The only difference is in the number of garbage collections that will be run during my application's run and the number of memory allocations. Am I right ?

Here are my reasons for this answer:

Setting the -Xms option to 512m doesn't result in my application using really 512M of phisical memory after startup. I guess this is related to moderns OS virtual memory management and lazy pages allocations. (I noticed that setting -Xms to 512M or to 64M doesn't change at all the initial used memory reported either by top on Linux or by the task manager on windows)

Can someone help me to understand the impact of this Xms option or point me to links that will help me to understand it?

Thanks in advance

Manu

A: 

if you wrote: -Xms=512m -Xmx=512m when it start, java allocate in those moment 512m of ram for his process and cant increment.

-Xms=64m -Xmx=512m when it start, java allocate only 64m of ram for his process, but java can be increment his memory occupation while 512m.

I think that second thing is better because you give to java the automatic memory management.

tommaso
I know that. But what "Java allocate in those moment 512m" exactly means ? This memory seems not effectively allocated since my 512m bytes system is able to launch several other applications without swaping and reprot me that only few megabytes are used by my java application..
Manuel Selva
Why was this downvoted? It is technically correct except for the last sentence which may or may not be correct. In a high performance world it is usually smarter to have java allocate all memory it will need with one single brk(). In other situations, allocating memory as you use it might be smarter.
Fredrik
I didn't downvoted this answer myself. Regarding your comment I have the same question than the one I asked to dan:Is there any "risk" or drawback to setting the Xms value to the same value than Xmx ?ThanksManu
Manuel Selva
Setting them to the same value is the recommended way for optimal performance. The drawback is that you need to take a bit more extra care to not have them set too high as doing so may have an impact on the overall performance of the system.
Fredrik
+1  A: 

The JVM will start with memory useage at the initial heap level. If the maxheap is higher, it will grow to the maxheap size as memory requirements exceed it's current memory.

So,

  • Xms=512m -Xmx=512m

JVM starts with 512 M, never resizes.

  • -Xms=64m -Xmx=512m

JVM starts with 64M, grows (up to max ceiling of 512) if mem. requirements exceed 64.

Steve B.
I know that. But as said in my previous comment what "Java will start with memory usage at the initial heap level" exactly means ? This memory seems not effectively allocated since my 512m bytes system is able to launch several other applications without swaping and reprot me that only few megabytes are used by my java application.
Manuel Selva
Typically you would set the initial heap size to a larger value if you knew that an app on start up would consume a particular amount of memory. This prevents the JVM from having to take execution time on start up to resize the heap a number of times. That particular use is a very common optimization to make eclipse run faster by avoiding the costly allocation cycle.
Dan
Thanks for this answer that leads me to this other question:Is there any "risk" or drawback to setting the Xms value to the same value than Xmx ?
Manuel Selva
As I understand the only risk is that you run out of virtual memory because you allocate too much virtual memory - but if your application really needs the memory that will happen anyway.
Turismo
A: 

The JVM resizes the heap adaptively, meaning it will attempt to find the best heap size for your application. -Xms and -Xmx simply specifies the range in which the JVM can operate and resize the heap. If -Xms and -Xmx are the same value, then the JVM's heap size will stay constant at that value.

It's typically best to just set -Xmx and let the JVM find the best heap size, unless there's a specific reason why you need to give the JVM a big heap at JVM launch.

As far as when the JVM actually requests the memory from the OS, I believe it depends on the platform and implementation of the JVM. I imagine that it wouldn't request the memory until your app actually needs it. -Xmx and -Xms just reserves the memory.

bajafresh4life
+3  A: 

This is probably helpful: http://forums.sun.com/thread.jspa?threadID=5300634

To summarize the information found after the link: The JVM allocates the amount specified by -Xms but the OS usually does not allocate real pages until they are needed. So the JVM allocates virtual memory as specified by Xms but only allocates physical memory as is needed.

You can see this by using Process Explorer by Sysinternals instead of task manager on windows.

So there is a real difference between using Xms=64M and Xms=512M. But I think the most important difference is the one you already pointed out: the garbage collector will run more often if you really need the 512MB but only started with 64MB.

Turismo