Two JVM options are often used to tune JVM heap size: -Xmx
for maximum heap size, and -Xms
for initial heap size. Here are some common mistakes I have seen when using them:
- Missing
m, M, g
orG
at the end (they are case insensitive). For example,
The correct command should be:java -Xmx128 BigApp
java.lang.OutOfMemoryError: Java heap spacejava -Xmx128m BigApp
. To be precise,-Xmx128
is a valid setting for very small apps, like HelloWorld. But in real life, I guess you really mean-Xmx128m
- Extra space in JVM options, or incorrectly use =. For example,
The correct command should bejava -Xmx 128m BigApp
Invalid maximum heap size: -Xmx
Could not create the Java virtual machine.
java -Xmx=512m HelloWorld
Invalid maximum heap size: -Xmx=512m
Could not create the Java virtual machine.java -Xmx128m BigApp
, with no whitespace nor =. -X options are different than -Dkey=value system properties, where = is used. - Only setting
-Xms
JVM option and its value is greater than the default maximum heap size, which is64m
. The default minimum heap size seems to be0
. For example,
The correct command should bejava -Xms128m BigApp
Error occurred during initialization of VM
Incompatible initial and maximum heap sizes specifiedjava -Xms128m -Xmx128m BigApp
. It's a good idea to set the minimum and maximum heap size to the same value. In any case, don't let the minimum heap size exceed the maximum heap size. - Heap size is larger than your computer's physical memory. For example,
The fix is to make it lower than the physical memory:java -Xmx2g BigApp
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.java -Xmx1g BigApp
- Incorrectly use
mb
as the unit, wherem
orM
should be used instead.java -Xms256mb -Xmx256mb BigApp
Invalid initial heap size: -Xms256mb
Could not create the Java virtual machine. - The heap size is larger than JVM thinks you would ever need. For example,
The fix is to lower it to a reasonable value:java -Xmx256g BigApp
Invalid maximum heap size: -Xmx256g
The specified size exceeds the maximum representable size.
Could not create the Java virtual machine.java -Xmx256m BigApp
- The value is not expressed in whole number. For example,
The correct command should bejava -Xmx0.9g BigApp
Invalid maximum heap size: -Xmx0.9g
Could not create the Java virtual machine.java -Xmx928m BigApp
How to set java heap size in Tomcat?
Stop Tomcat server, set environment variable
CATALINA_OPTS
, and then restart Tomcat. Look at the file tomcat-install/bin/catalina.sh
or catalina.bat
for how this variable is used. For example,set CATALINA_OPTS="-Xms512m -Xmx512m" (Windows)
export CATALINA_OPTS="-Xms512m -Xmx512m" (ksh/bash)
setenv CATALINA_OPTS "-Xms512m -Xmx512m" (tcsh/csh)
In catalina.bat or catallina.sh, you may have noticed CATALINA_OPTS, JAVA_OPTS, or both can be used to specify Tomcat JVM options. What is the difference between CATALINA_OPTS and JAVA_OPTS? The name CATALINA_OPTS is specific for Tomcat servlet container, whereas JAVA_OPTS may be used by other java applications (e.g., JBoss). Since environment variables are shared by all applications, we don't want Tomcat to inadvertently pick up the JVM options intended for other apps. I prefer to use CATALINA_OPTS.How to set java heap size in JBoss?
Stop JBoss server, edit
$JBOSS_HOME/bin/run.conf
, and then restart JBoss server. You can change the line with JAVA_OPTS
to something like:JAVA_OPTS="-server -Xms128m -Xmx128m"
How to set java heap size in Eclipse?You have 2 options:
1. Edit eclipse-home/eclipse.ini to be something like the following and restart Eclipse.
-vmargs
-Xms64m
-Xmx256m
2. Or, you can just run eclipse command with additional options at the very end. Anything after -vmargs will be treated as JVM options and passed directly to the JVM. JVM options specified in the command line this way will always override those in eclipse.ini. For example,eclipse -vmargs -Xms64m -Xmx256m
How to set java heap size in NetBeans?Exit NetBeans, edit the file
netbeans-install/etc/netbeans.conf
. For example,netbeans_default_options="-J-Xms512m -J-Xmx512m -J-XX:PermSize=32m -J-XX:MaxPermSize=128m -J-Xverify:none
How to set java heap size in Apache Ant?Set environment variable
ANT_OPTS
. Look at the file $ANT_HOME/bin/ant
or %ANT_HOME%\bin\ant.bat
, for how this variable is used by Ant runtime.set ANT_OPTS="-Xms512m -Xmx512m" (Windows)
export ANT_OPTS="-Xms512m -Xmx512m" (ksh/bash)
setenv ANT_OPTS "-Xms512m -Xmx512m" (tcsh/csh)
How to set java heap size in jEdit?jEdit is a java application, and basically you need to set minimum/maximum heap size JVM options when you run java command. jEdit by default runs with a default maximum heap size 64m. When you work on large files, you are likely to get these errors:
java.lang.OutOfMemoryError: Java heap space
at java.lang.String.concat(String.java:2001)
at org.gjt.sp.jedit.buffer.UndoManager.contentInserted(UndoManager.java:160)
at org.gjt.sp.jedit.Buffer.insert(Buffer.java:1139)
at org.gjt.sp.jedit.textarea.JEditTextArea.setSelectedText(JEditTextArea.java:2052)
at org.gjt.sp.jedit.textarea.JEditTextArea.setSelectedText(JEditTextArea.java:2028)
at org.gjt.sp.jedit.Registers.paste(Registers.java:263)
How to fix it? If you click a desktop icon, or Start menu item to start jEdit: right-click the icon or menu item, view its property, and you can see its target is something like:
C:\jdk6\bin\javaw.exe -jar "C:\jedit\jedit.jar"
You can change that line to:C:\jdk6\bin\javaw.exe -Xmx128m -Xms128m -jar "C:\jedit\jedit.jar"
If you run a script to start jEdit: just add these JVM options to the java line inside the script file:java -Xmx128m -Xms128m -jar jedit.jar
If you start jEdit by running java command: just add these JVM options to your java command:java -Xmx128m -Xms128m -jar jedit.jar
Note that when you run java with -jar option, anything after -jar jar-file
will be treated as application arguments. So you should always put JVM options before -jar
. Otherwise, you will get error:C:\jedit>java -jar jedit.jar -Xmx128m
Unknown option: -Xmx128m
Usage: jedit [] []
How to set java heap size in JavaEE SDK/J2EE SDK/Glassfish/Sun Java System Application Server?Stop the application server, edit
$GLASSFISH_HOME/domains/domain1/config/domain.xml
, search for XML element name java-config
and jvm-options
. For example,
-Xmx512m
-XX:NewRatio=2
-XX:MaxPermSize=128m
...
You can also change these settings in the web-based admin console, typically at http://localhost:4848/, or https://localhost:4848/. Go to Application Server near the top of the left panel, and then on the right panel, click JVM Settings -> JVM Options, and you will see a list of existing JVM options. You can add new ones and modify existing ones there.Yet another option is to use its Command Line Interface (CLI) tool command, such as:
./asadmin help create-jvm-options
./asadmin help delete-jvm-options
They may be a bit hard to use manually, but are well suited for automated scripts.
7 comments:
Editing the java heap size in Apache Axis 2...
edit the bin/axis2server.sh file
change
java -classpath "$AXIS2...
to
java -Xms256m -Xmx2g -classpath "$AXIS2...
Thanks garett
Will a higher value for the initial heap size make a difference when the max value is unchanged?
("-Xms128m -Xmx512m" Vs "-Xms256m -Xmx512m")
Thanks.
Initially I was getting:
Invalid initial heap size: -Xms256M -Xmx512M
The ant version I used was 1.7.x and the JAVA_HOME is set to use "E:\java\jdk1.5.0_15"
Resetting the heap didn't help.
I'm not getting a workable solution to
solved by trial and error, by setting just -Xmx value.
Thanks for the input
Thanks pitchblack.
I was using Ant version 1.71 and I was getting the following error:
java.lang.OutOfMemoryError: Java heap space
I tried setting my ANT_OPTS as follows:
set ANT_OPTS="-Xms512m -Xmx512m"
but I kept getting the following error:
Invalid initial heap size: -Xms128m -Xmx256m
Simply setting the Xmx value on its own as you suggested seemed to solve it.
Thanks for putting this information in short and concise format. just to add its important to remember that we need to put "m" or "M" or "G" to denote Mega and Giga in -Xms and -Xmx. Also based upon my experience keeping -Xms and -Xms ration either 1:1 or 1.5:1 works well in terms of minimizing garbage collection.
Thanks
Javin
How Garbage collection works in Java
Post a Comment