What are the Xms and Xmx parameters when starting JVMs?



Please explain the use of Xms and Xmx parameters in JVMs. What are the default values for them?


Posted 2013-02-07T23:28:20.607

Reputation: 3 967

Question was closed 2016-03-14T03:49:33.757

2when using -Xmx128m -Xms64m it can peak around 275m RES mem, but when using -Xmx128m -Xms128m it can peak around 550m RES mem Using Java 8 Best thing is to stress the GC and look at what happens ... – Christophe Roussy – 2018-02-20T16:03:24.560


1 039

The flag Xmx specifies the maximum memory allocation pool for a Java virtual machine (JVM), while Xms specifies the initial memory allocation pool.

This means that your JVM will be started with Xms amount of memory and will be able to use a maximum of Xmx amount of memory. For example, starting a JVM like below will start it with 256 MB of memory and will allow the process to use up to 2048 MB of memory:

java -Xms256m -Xmx2048m

The memory flag can also be specified in multiple sizes, such as kilobytes, megabytes, and so on.


The Xms flag has no default value, and Xmx typically has a default value of 256 MB. A common use for these flags is when you encounter a java.lang.OutOfMemoryError.

When using these settings, keep in mind that these settings are for the JVM's heap, and that the JVM can/will use more memory than just the size allocated to the heap. From Oracle's documentation:

Note that the JVM uses more memory than just the heap. For example Java methods, thread stacks and native handles are allocated in memory separate from the heap, as well as JVM internal data structures.


Posted 2013-02-07T23:28:20.607

Reputation: 52 354

7So is it like when memory usage exceeds beyond Xmx we get jvm out of memory exception. – Pankaj – 2013-02-07T23:41:21.720

39Yes, that's correct. When it tries to exceed that, although it may collect garbage to try to free up enough memory. If there still isn't enough memory to satisfy the request and the heap has already reached the maximum size, an OutOfMemoryError will occur. – David Conrad – 2013-10-10T17:38:15.017

2When I'm using the ForkJoin framework my computer crashes because it's taking up too much memory. Is it possible that on OpenJDK there is no hard limit on the memory by default? – Christophe De Troyer – 2014-05-26T13:33:18.027


As clarified at Does java -Xmx 1G mean 1 GB or 2^30 B?, the unambiguous way to express how much memory you start with via -Xms256m is "256 MiB", not "256 MB", since it goes by binary powers rather than powers of ten. See https://en.wikipedia.org/wiki/Binary_prefix. In addition, because some unusable space is set aside for an extra pool of Survivor space, the amount of memory actually available according to Runtime.getRuntime().maxMemory() is less than the value specified via -Xmx

– nealmcb – 2015-09-30T05:20:42.500


A useful guide of common errors relating to heap size: http://blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size/

– ctrlplusb – 2015-12-15T15:32:32.747

-Xmx8g what does g stand for ? – Arun Bertil – 2016-06-13T11:54:35.160

"Xmx typically has a default value of 256MB" - very unlikely, that would crash most of the apps - See this: http://stackoverflow.com/questions/4667483/how-is-the-default-java-heap-size-determined

– Jack – 2017-04-10T08:10:51.143

Why I set xmx=xms=8g, my java process does not consume 8g but a much smaller memory when it starts, which I observe from top -->RES. Shouldn't it be allocated by at least the xms memory? – Jaskey – 2017-10-17T03:47:24.270

@Jack I think the 256MB was the default value for Java 6 or 7. Java 8+ uses different default values. – Robert – 2017-10-27T10:46:01.953


Run the command java -X and you will get a list of all -X options:

C:\Users\Admin>java -X
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
-Xdiag            show additional diagnostic messages
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size.........................
-Xmx<size>        set maximum Java heap size.........................
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.
-XshowSettings    show all settings and continue
-XshowSettings:all         show all settings and continue
-XshowSettings:vm          show all vm related settings and continue
-XshowSettings:properties  show all property settings and continue
-XshowSettings:locale      show all locale related settings and continue

The -X options are non-standard and subject to change without notice.

I hope this will help you understand Xms, Xmx as well as many more other things that matters the most. :)

Rupesh Yadav

Posted 2013-02-07T23:28:20.607

Reputation: 10 745


You can specify it in your IDE. For example, for Eclipse in Run ConfigurationsVM arguments. You enter -Xmx800m -Xms500m:

Enter image description here


Posted 2013-02-07T23:28:20.607

Reputation: 253

In RubyMine on OSX, it's in Help menu > Edit Custom VM Options. – Jon Schneider – 2018-09-19T20:33:01.347


The main part of the question has already been addressed above. Just adding part of the default values.

As per http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

The default value of Xmx will depend on platform and amount of memory available in the system.

Abhishek Aich

Posted 2013-02-07T23:28:20.607

Reputation: 111


For other JVMs (besides JRockit), see this post to determine default Xmx/Xms values of your JVM: http://stackoverflow.com/questions/4667483/how-is-the-default-java-heap-size-determined

– Ogre Psalm33 – 2014-08-21T14:13:35.927