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

- 3,902
- 1
- 44
- 58

- 14,638
- 3
- 17
- 23
-
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 Feb 20 '18 at 16:03
-
4Just being curious, the 275m and 550m - How were they calculated? – Manuel Jordan Jan 14 '21 at 12:38
-
Default values see https://stackoverflow.com/questions/4667483/how-is-the-default-max-java-heap-size-determined – rogerdpack Feb 23 '22 at 23:13
5 Answers
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 different sizes, such as kilobytes, megabytes, and so on.
-Xmx1024k
-Xmx512m
-Xmx8g
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 and 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.

- 3,049
- 2
- 25
- 40

- 88,222
- 31
- 159
- 162
-
24So is it like when memory usage exceeds beyond Xmx we get jvm out of memory exception. – Pankaj Feb 07 '13 at 23:41
-
75Yes, 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 Oct 10 '13 at 17:38
-
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 May 26 '14 at 13:33
-
9As clarified at [Does java -Xmx 1G mean 1 GB or 2^30 B?](http://stackoverflow.com/questions/32855984/does-java-xmx-1g-mean-1-gb-or-230-b/32858015#32858015), 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 Sep 30 '15 at 05:20
-
2A useful guide of common errors relating to heap size: http://blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size/ – ctrlplusb Dec 15 '15 at 15:32
-
-
"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 Apr 10 '17 at 08:10
-
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? – JaskeyLam Oct 17 '17 at 03:47
-
@Jack I think the 256MB was the default value for Java 6 or 7. Java 8+ uses different default values. – Robert Oct 27 '17 at 10:46
-
-
@David Conrad, I tried the same approach and added Xmx 1GB. Now, I have another two OutOfMemory errors. `Java.lang.OutOfMemoryError: Java heap space` and `Java.lang.OutOfMemoryError: GC overhead limit exceeded`. Is this related to Xmx? which I updated to 1GB. I tried with Xmx512 as well but still, it has the same error. Once I start a server after period of time it shows the same error again. – Harshad Chhaiya Feb 22 '20 at 08:13
-
@ChhaiyaHarshad You should submit a question with details of what your application is doing and the exact command used to start it. It sounds like you have a memory leak. – David Conrad Feb 22 '20 at 17:40
-
2This information is no longer up to date: "The Xms flag has no default value, and Xmx typically has a default value of 256 MB". It depends if Java considers the machine to be a client or server, and for servers, Xmx can be up to 32GiB. Take a look at https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html and https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size – Daniel Jun 18 '20 at 19:35
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 other things that matters the most. :)

- 7,420
- 4
- 53
- 63

- 12,096
- 4
- 53
- 70
-Xms is the initial heap size for the startup, however, during the working process, the heap size can be less than -Xms due to users' inactivity or GC iterations. This is not a minimum required heap size.
-Xmx is the maximum heap size

- 39
- 1
- 6

- 1,453
- 1
- 14
- 26
-
3Could you please give more details about "due to users' inactivity or GC iterations"? And what is the difference between initial and minimal heap sizes then? – Tony Jan 24 '21 at 07:18
-
I just realized today that `-Xms` doesn't indicate minimum required heap memory size. We are running a java process with `-Xms` set to 200 GB running on a machine with 256 GB RAM. And the process is only consuming 10 GB so far and that's because not much activity was done by the process so far. So, this answer did confirm that but I'm looking to see the documentation/sources about this. thank you so much! – asgs Jun 03 '22 at 16:46
-
2There are three heap sizes: used, committed, and max. Used heap size can be less than -Xms, but committed heap size (i.e. allocated from the OS via malloc()) is always at least -Xms. Some operating systems will happily malloc() more memory than the have and hope not all applications actually use everything they malloc()ed, so "committed" is a somewhat relative term. – toolforger Jun 28 '22 at 12:15
The question itself 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.

- 7,420
- 4
- 53
- 63

- 151
- 1
- 2
-
8For 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 Aug 21 '14 at 14:13
You can specify it in your IDE. For example, for Eclipse in Run Configurations → VM arguments. You can enter -Xmx800m -Xms500m
as

- 7,420
- 4
- 53
- 63

- 439
- 3
- 4
-
-
28This doesn't answer the question. The question is about what they are for, not how to set them. – Captain Man Feb 06 '19 at 17:18