This post attempts to demystify command-line options of the Java Virtual Machine (JVM). I’m talking about those strange characters you often have to type when starting Java to run a program. The options are often used to specify environment variables (class path), configure performance characteristics of the JVM (garbage collection frequency), amongst many other things.
For example, a sample of valid command line options are shown below in bold.
java -Xmx6g AClass
java -Xms4g -Xmx6g SomeClass
java -DSomeVal="foo" MyProgram
java -DSomeVal="foo" -cp MyProgram.jar -Xmx6g -XX:+UseCompressedOops -XX:+UseG1GC com.foo.Bar
JVM also support many command-line options which allow users to specify:
- Minimum and Maximum Size of the Heap Memory
- Type of Garbage Collector
- Type of JIT Compiler (Client or Server), or,
- To display JVM version,
Java Language Specification (JLS) breaks the command-line options into three categories based on their maturity level. The most mature options belong to a category called “Standard Options” and must be supported by all JVM’s. Less mature options are called “Non-Standard“. These are specific to JVM (e.g. HotSpot) and are subject to change between releases. There is also a third category of options called “Developer Options“. Developer options are a shade of Non-Standard.
Quick Recap: JVM command-line options are used to specify configuration settings to control execution of the Virtual Machine. These options are broken into three categories as shown below:
- Standard Options
- Non-Standard Options
- Developer Options (Experimental)
Let’s look at the categories in detail.
1. Standard Options
The Standard Options are regulated by the Java Virtual Machine Specification and must be supported by all implementations of Java Virtual Machines. For example, OpenJDK, HotSpot, etc. Standard Options are stable and do not change between releases. Standard Options begin with a - followed by the name of option, e.g. -version
Some standard options are shown below:
java -cp <PATH>
java -jar MyProgram.jar
2. Non-Standard Options
Non-Standard Options always begin with -X. The fact that they are not guaranteed to be supported in all implementations of the JVM or even between versions, did little to hurt their popularity. Non-Standard Options remain popular and are widely used. These options often specify an integer value with a suffix of k,m, or g to specify kilo, mega or giga. To get a list of all Non-Standard Options supported by your JVM, you can invoke the launcher with -X, e.g. `java -X`. Examples:
3. Developer Options
Developers Options always begin with -XX. They are also Non-Standard. They follow the following format for setting boolean Options: -XX: followed by either + or - to indicate true or false, followed by the name of option.
-XX:+UseCompressedOops (Indicates that the Option UseCompressedOops must be used)
From, Java Documentation:
Boolean options are turned on with
-XX:+<option>and turned off with
Numeric options are set with
-XX:<option>=<number>. Numbers can include ‘m’ or ‘M’ for megabytes, ‘k’ or ‘K’ for kilobytes, and ‘g’ or ‘G’ for gigabytes (for example, 32k is the same as 32768).
String options are set with
-XX:<option>=<string>, are usually used to specify a file, a path, or a list of commands
Click here for a complete list of Options from Oracle.