---
# Copyright (c) 1994, 2025, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

title: 'JAVA(1) JDK @@VERSION_SHORT@@ | JDK Commands'
date: @@COPYRIGHT_YEAR@@
lang: en
---

## Name

java - launch a Java application

## Synopsis

To launch a class file:

`java` \[*options*\] *mainclass* \[*args* ...\]

To launch the main class in a JAR file:

`java` \[*options*\] `-jar` *jarfile* \[*args* ...\]

To launch the main class in a module:

`java` \[*options*\] `-m` *module*\[`/`*mainclass*\] \[*args* ...\]

or

`java` \[*options*\] `--module` *module*\[`/`*mainclass*\] \[*args* ...\]

To launch a source-file program:

`java` \[*options*\] *source-file* \[*args* ...\]

*options*
:   Optional: Specifies command-line options separated by spaces. See [Overview
    of Java Options] for a description of available
    options.

*mainclass*
:   Specifies the name of the class to be launched. Command-line entries
    following `classname` are the arguments for the main method.

`-jar` *jarfile*
:   Executes a program encapsulated in a JAR file. The *jarfile* argument is
    the name of a JAR file with a manifest that contains a line in the form
    `Main-Class:`*classname* that defines the class with the
    `public static void main(String[] args)` method that serves as your
    application's starting point. When you use `-jar`, the specified JAR file
    is the source of all user classes, and other class path settings are
    ignored. If you're using JAR files, then see [jar](jar.html).

`-m` or `--module` *module*\[`/`*mainclass*\]
:   Executes the main class in a module specified by *mainclass* if it is
    given, or, if it is not given, the value in the *module*. In other words,
    *mainclass* can be used when it is not specified by the module, or to
    override the value when it is specified.

    See [Standard Options for Java].

*source-file*
:   Only used to launch a source-file program. Specifies the source file
    that contains the main class when using source-file mode. See [Using
    Source-File Mode to Launch Source-Code Programs]

*args* ...
:   Optional: Arguments following *mainclass*, *source-file*, `-jar` *jarfile*,
    and `-m` or `--module` *module*`/`*mainclass* are passed as arguments to
    the main class.

## Description

The `java` command starts a Java application. It does this by starting the Java
Virtual Machine (JVM), loading the specified class, and calling that
class's `main()` method. The method must be declared `public` and `static`, it
must not return any value, and it must accept a `String` array as a parameter.
The method declaration has the following form:

>   `public static void main(String[] args)`

In source-file mode, the `java` command can launch a class declared in a source
file. See [Using Source-File Mode to Launch Source-Code Programs]
for a description of using the source-file mode.

> **Note:** You can use the `JDK_JAVA_OPTIONS` launcher environment variable to prepend its
content to the actual command line of the `java` launcher. See [Using the
JDK\_JAVA\_OPTIONS Launcher Environment Variable].

By default, the first argument that isn't an option of the `java` command is
the fully qualified name of the class to be called. If `-jar` is specified,
then its argument is the name of the JAR file containing class and resource
files for the application. The startup class must be indicated by the
`Main-Class` manifest header in its manifest file.

Arguments after the class file name or the JAR file name are passed to the
`main()` method.

### `javaw`

**Windows:** The `javaw` command is identical to `java`, except that with
`javaw` there's no associated console window. Use `javaw` when you don't want a
command prompt window to appear. The `javaw` launcher will, however, display a
dialog box with error information if a launch fails.

## Using Source-File Mode to Launch Source-Code Programs

To launch a class declared in a source file, run the `java` launcher in
source-file mode. Entering source-file mode is determined by two items on the
`java` command line:

-   The first item on the command line that is not an option or part of an
    option. In other words, the item in the command line that would otherwise
    be the main class name.

-   The `--source` *version* option, if present.

If the class identifies an existing file that has a `.java` extension, or if
the `--source` option is specified, then source-file mode is selected. The
source file is then compiled and run. The `--source` option can be used to
specify the source *version* or *N* of the source code. This determines the API
that can be used. When you set `--source` *N*, you can only use the public API
that was defined in JDK *N*.

> **Note:** The valid values of *N* change for each release, with new values added and old
values removed. You'll get an error message if you use a value of *N* that is
no longer supported.
The supported values of *N* are the current Java SE release (`@@VERSION_SPECIFICATION@@`)
and a limited number of previous releases, detailed in the command-line help
for `javac`, under the `--source` and `--release` options.

If the file does not have the `.java` extension, the `--source` option must be
used to tell the `java` command to use the source-file mode. The `--source`
option is used for cases when the source file is a "script" to be executed and
the name of the source file does not follow the normal naming conventions for
Java source files.

In source-file mode, the effect is as though the source file is compiled into
memory, and the first class found in the source file is executed. Any arguments
placed after the name of the source file in the original command line are
passed to the compiled class when it is executed.

For example, if a file were named `HelloWorld.java` and contained a class named
`HelloWorld`, then the source-file mode command to launch the class would be:

>   `java HelloWorld.java`

This use of source-file mode is informally equivalent to using the following two
commands:

```
javac -d <memory> --source-path <source-root> HelloWorld.java
java --class-path <memory> HelloWorld
```

where `<source-root>` is computed

**In source-file mode, any additional command-line options are processed as
follows:**

-   The launcher scans the options specified before the source file for any
    that are relevant in order to compile the source file.

    This includes: `--class-path`, `--module-path`, `--add-exports`,
    `--add-modules`, `--limit-modules`, `--patch-module`,
    `--upgrade-module-path`, and any variant forms of those options. It also
    includes the new `--enable-preview` option, described in JEP 12.

-   No provision is made to pass any additional options to the compiler, such
    as `-processor` or `-Werror`.

-   Command-line argument files (`@`-files) may be used in the standard way.
    Long lists of arguments for either the VM or the program being invoked may
    be placed in files specified on the command-line by prefixing the filename
    with an `@` character.

**In source-file mode, compilation proceeds as follows:**

-   Any command-line options that are relevant to the compilation environment
    are taken into account. These include: `--class-path`/`-classpath`/`-cp`,
    `--module-path`/`-p`, `--add-exports`, `--add-modules`, `--limit-modules`,
    `--patch-module`, `--upgrade-module-path`, `--enable-preview`.

-   The root of the source tree, `<source-root>` is computed from the package
    of the class being launched. For example, if `HelloWorld.java` declared its classes
    to be in the `hello` package, then the file `HelloWorld.java` is expected
    to reside in the directory `somedir/hello/`. In this case, `somedir` is
    computed to be the root of the source tree.

-   The root of the source tree serves as the source-path for compilation, so that
    other source files found in that tree and are needed by `HelloWorld` could be
    compiled.

-   Annotation processing is disabled, as if `-proc:none` is in effect.

-   If a version is specified, via the `--source` option, the value is used as
    the argument for an implicit `--release` option for the compilation. This
    sets both the source version accepted by compiler and the system API that
    may be used by the code in the source file.

-   If `--enable-preview` is specified, the `--source N` arguments can be omitted.
    If the Java runtime version is `N`, then `--release N` is implied when
    compiling source files.

-   If a `module-info.java` file exists in the `<source-root>` directory, its
    module declaration is used to define a named module that will contain all
    the classes compiled from `.java` files in the source tree. If
    `module-info.java` does not exist, all the classes compiled from source files
    will be compiled in the context of the unnamed module.

-   The source file that is launched should contain one or more top-level classes, the first of
    which is taken as the class to be executed.

-   For the source file that is launched, the compiler does not enforce the optional restriction defined at the end
    of JLS 7.6, that a type in a named package should exist in a file whose
    name is composed from the type name followed by the `.java` extension.

-   If a source file contains errors, appropriate error messages are written
    to the standard error stream, and the launcher exits with a non-zero exit
    code.

**In source-file mode, execution proceeds as follows:**

-   The class to be executed is the first top-level class found in the source
    file. It must contain a declaration of an entry `main` method.

-   The compiled classes are loaded by a custom class loader, that delegates to
    the application class loader. This implies that classes appearing on the
    application class path cannot refer to any classes declared in source files.

-   If a `module-info.java` file exists in the `<source-root>` directory, then all
    the classes compiled from `.java` files in the source tree will be in that
    module, which will serve as the root module for the execution of the program.
    If `module-info.java` does not exist, the compiled classes are executed in the
    context of an unnamed module, as though `--add-modules=ALL-DEFAULT` is in effect.
    This is in addition to any other `--add-module` options that may be have been
    specified on the command line.

-   Any arguments appearing after the name of the file on the command line are
    passed to the main method in the obvious way.

-   It is an error if there is a class on the application class path whose name
    is the same as that of the class to be executed.

See [JEP 458: Launch Multi-File Source-Code Programs](
https://openjdk.org/jeps/458) for complete details.

## Using the JDK\_JAVA\_OPTIONS Launcher Environment Variable

`JDK_JAVA_OPTIONS` prepends its content to the options parsed from the command
line. The content of the `JDK_JAVA_OPTIONS` environment variable is a list of
arguments separated by white-space characters (as determined by `isspace()`).
These are prepended to the command line arguments passed to `java` launcher.
The encoding requirement for the environment variable is the same as the `java`
command line on the system. `JDK_JAVA_OPTIONS` environment variable content is
treated in the same manner as that specified in the command line.

Single (`'`) or double (`"`) quotes can be used to enclose arguments that
contain whitespace characters. All content between the open quote and the
first matching close quote are preserved by simply removing the pair of quotes.
In case a matching quote is not found, the launcher will abort with an error
message. `@`-files are supported as they are specified in the command line.
Any wildcard literal `*` in the `JDK_JAVA_OPTIONS` environment variable
content isn't expanded and is passed as-is to the starting VM. In order to
mitigate potential misuse of `JDK_JAVA_OPTIONS` behavior, options that specify
the main class (such as `-jar`) or cause the `java` launcher to exit without
executing the main class (such as `-h`) are disallowed in the environment
variable. If any of these options appear in the environment variable, the
launcher will abort with an error message. When `JDK_JAVA_OPTIONS` is set, the
launcher prints a message to stderr as a reminder.

**Example:**

```
$ export JDK_JAVA_OPTIONS='-g @file1 -Dprop=value @file2 -Dws.prop="white spaces"'
$ java -Xint @file3
```

is equivalent to the command line:

```
java -g @file1 -Dprop=value @file2 -Dws.prop="white spaces" -Xint @file3
```

## Overview of Java Options

The `java` command supports a wide range of options in the following
categories:

-   [Standard Options for Java]\: Options guaranteed to be supported by all
    implementations of the Java Virtual Machine (JVM). They're used for common
    actions, such as checking the version of the JRE, setting the class path,
    enabling verbose output, and so on.

-   [Extra Options for Java]\: General purpose options that are specific to the
    Java HotSpot Virtual Machine. They aren't guaranteed to be supported by
    all JVM implementations, and are subject to change. These options start
    with `-X`.

The advanced options aren't recommended for casual use. These are developer
options used for tuning specific areas of the Java HotSpot Virtual Machine
operation that often have specific system requirements and may require
privileged access to system configuration parameters. Several examples of
performance tuning are provided in [Performance Tuning Examples]. These
options aren't guaranteed to be supported by all JVM implementations and are
subject to change. Advanced options start with `-XX`.

-   [Advanced Runtime Options for Java]\: Control the runtime behavior of the
    Java HotSpot VM.

-   [Advanced JIT Compiler Options for java]\: Control the dynamic just-in-time
    (JIT) compilation performed by the Java HotSpot VM.

-   [Advanced Serviceability Options for Java]\: Enable gathering system
    information and performing extensive debugging.

-   [Advanced Garbage Collection Options for Java]\: Control how garbage
    collection (GC) is performed by the Java HotSpot

Boolean options are used to either enable a feature that's disabled by default
or disable a feature that's enabled by default. Such options don't require a
parameter. Boolean `-XX` options are enabled using the plus sign
(`-XX:+`*OptionName*) and disabled using the minus sign (`-XX:-`*OptionName*).

For options that require an argument, the argument may be separated from the
option name by a space, a colon (:), or an equal sign (=), or the argument may
directly follow the option (the exact syntax differs for each option). If
you're expected to specify the size in bytes, then you can use no suffix, or
use the suffix `k` or `K` for kilobytes (KB), `m` or `M` for megabytes (MB), or
`g` or `G` for gigabytes (GB). For example, to set the size to 8 GB, you can
specify either `8g`, `8192m`, `8388608k`, or `8589934592` as the argument. If
you are expected to specify the percentage, then use a number from 0 to 1. For
example, specify `0.25` for 25%.

The following sections describe the options that are deprecated, obsolete, and
removed:

-   [Deprecated Java Options]\: Accepted and acted upon --- a warning is issued
    when they're used.

-   [Obsolete Java Options]\: Accepted but ignored --- a warning is issued when
    they're used.

-   [Removed Java Options]\: Removed --- using them results in an error.

## Standard Options for Java

These are the most commonly used options supported by all implementations of
the JVM.

> **Note:** To specify an argument for a long option, you can use either
`--`*name*`=`*value* or `--`*name* *value*.

`-agentlib:`*libname*\[`=`*options*\]
:   Loads the specified native agent library. After the library name, a
    comma-separated list of options specific to the library can be used.
    If the option `-agentlib:foo` is specified, then the JVM attempts to
    load the library named `foo` using the platform specific naming
    conventions and locations:

    -   **Linux and other POSIX-like platforms:** The JVM attempts to load
         the library named `libfoo.so` in the location specified by the
         `LD_LIBRARY_PATH` system variable.

    -   **macOS:** The JVM attempts to load the library named `libfoo.dylib`
        in the location specified by the `DYLD_LIBRARY_PATH` system variable.

    -   **Windows:** The JVM attempts to load the library named `foo.dll` in
        the location specified by the `PATH` system variable.

        The following example shows how to load the Java Debug Wire Protocol
        (JDWP) library and listen for the socket connection on port 8000,
        suspending the JVM before the main class loads:

        >   `-agentlib:jdwp=transport=dt_socket,server=y,address=8000`

`-agentpath:`*pathname*\[`=`*options*\]
:   Loads the native agent library specified by the absolute path name. This
    option is equivalent to `-agentlib` but uses the full path and file name of
    the library.

`--class-path` *classpath*, `-classpath` *classpath*, or `-cp` *classpath*
:   Specifies a list of directories, JAR files, and ZIP archives to search
    for class files.

    On Windows, semicolons (`;`) separate entities in this list;
    on other platforms it is a colon (`:`).

    Specifying *classpath* overrides any setting of the `CLASSPATH` environment
    variable. If the class path option isn't used and *classpath* isn't set,
    then the user class path consists of the current directory (.).

    As a special convenience, a class path element that contains a base name of
    an asterisk (\*) is considered equivalent to specifying a list of all the
    files in the directory with the extension `.jar` or `.JAR` . A Java program
    can't tell the difference between the two invocations. For example, if the
    directory mydir contains `a.jar` and `b.JAR`, then the class path element
    mydir/\* is expanded to `A.jar:b.JAR`, except that the order of JAR files
    is unspecified. All `.jar` files in the specified directory, even hidden
    ones, are included in the list. A class path entry consisting of an
    asterisk (\*) expands to a list of all the jar files in the current
    directory. The `CLASSPATH` environment variable, where defined, is
    similarly expanded. Any class path wildcard expansion that occurs before
    the Java VM is started. Java programs never see wildcards that aren't
    expanded except by querying the environment, such as by calling
    `System.getenv("CLASSPATH")`.

`--disable-@files`
:   Can be used anywhere on the command line, including in an argument file, to
    prevent further `@filename` expansion. This option stops expanding
    `@`-argfiles after the option.

`--enable-preview`
:   Allows classes to depend on [preview features](https://docs.oracle.com/en/java/javase/12/language/index.html#JSLAN-GUID-5A82FE0E-0CA4-4F1F-B075-564874FE2823) of the release.

`--enable-native-access` *module*\[`,`*module*...\]
:   Native access involves access to code or data outside the Java runtime.
    This is generally unsafe and, if done incorrectly, might crash the JVM or result
    in memory corruption. Native access can occur as a result of calling a method that
    is either [restricted](https://openjdk.org/jeps/454#Safety), or `native`.
    This option allows code in the specified modules to perform native access.
    Native access occurring in a module that has not been explicitly enabled
    is deemed *illegal*.

    *module* can be a module name, or `ALL-UNNAMED` to indicate code on the class path.


-`--illegal-native-access=`*parameter*
:   This option specifies a mode for how illegal native access is handled:

    > **Note:** This option will be removed in a future release.

    -   `allow`: This mode allows illegal native access in all modules,
        without any warings.

    -   `warn`: This mode is identical to `allow` except that a warning
        message is issued for the first illegal native access found in a module.
        This mode is the default for the current JDK but will change in a future
        release.

    -   `deny`: This mode disables illegal native access. That is, any illegal native
        access causes an `IllegalCallerException`. This mode will become the default
        in a future release.

    To verify that your application is ready for a future version of the JDK,
    run it with `--illegal-native-access=deny` along with any necessary `--enable-native-access`
    options.

`--finalization=`*value*
:   Controls whether the JVM performs finalization of objects. Valid values
    are "enabled" and "disabled". Finalization is enabled by default, so the
    value "enabled" does nothing. The value "disabled" disables finalization,
    so that no finalizers are invoked.

`--module-path` *modulepath*... or `-p` *modulepath*
:   Specifies where to find application modules with a list of path elements.
    The elements of a module path can be a file path to a module or a directory
    containing modules. Each module is either a modular JAR or an
    exploded-module directory.

    On Windows, semicolons (`;`) separate path elements in this list;
    on other platforms it is a colon (`:`).

`--upgrade-module-path` *modulepath*...
:   Specifies where to find module replacements of upgradeable modules in the
    runtime image with a list of path elements.
    The elements of a module path can be a file path to a module or a directory
    containing modules. Each module is either a modular JAR or an
    exploded-module directory.

    On Windows, semicolons (`;`) separate path elements in this list;
    on other platforms it is a colon (`:`).

`--add-modules` *module*\[`,`*module*...\]
:   Specifies the root modules to resolve in addition to the initial module.
    *module* can also be `ALL-DEFAULT`, `ALL-SYSTEM`, and `ALL-MODULE-PATH`.

`--list-modules`
:   Lists the observable modules and then exits.

`-d` *module\_name* or `--describe-module` *module\_name*
:   Describes a specified module and then exits.

`--dry-run`
:   Creates the VM but doesn't execute the main method. This `--dry-run` option
    might be useful for validating the command-line options such as the module
    system configuration.

`--validate-modules`
:   Validates all modules and exit. This option is helpful for finding
    conflicts and other errors with modules on the module path.

`-D`*property*`=`*value*
:   Sets a system property value. The *property* variable is a string with no
    spaces that represents the name of the property. The *value* variable is a
    string that represents the value of the property. If *value* is a string
    with spaces, then enclose it in quotation marks (for example
    `-Dfoo="foo bar"`).

`-disableassertions`\[`:`\[*packagename*\]...\|`:`*classname*\] or `-da`\[`:`\[*packagename*\]...\|`:`*classname*\]
:   Disables assertions. By default, assertions are disabled in all packages
    and classes. With no arguments, `-disableassertions` (`-da`) disables
    assertions in all packages and classes. With the *packagename* argument
    ending in `...`, the switch disables assertions in the specified package
    and any subpackages. If the argument is simply `...`, then the switch
    disables assertions in the unnamed package in the current working
    directory. With the *classname* argument, the switch disables assertions in
    the specified class.

    The `-disableassertions` (`-da`) option applies to all class loaders and to
    system classes (which don't have a class loader). There's one exception to
    this rule: If the option is provided with no arguments, then it doesn't
    apply to system classes. This makes it easy to disable assertions in all
    classes except for system classes. The `-disablesystemassertions` option
    enables you to disable assertions in all system classes. To explicitly
    enable assertions in specific packages or classes, use the
    `-enableassertions` (`-ea`) option. Both options can be used at the same
    time. For example, to run the `MyClass` application with assertions enabled
    in the package `com.wombat.fruitbat` (and any subpackages) but disabled in
    the class `com.wombat.fruitbat.Brickbat`, use the following command:

    >   `java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat
        MyClass`

`-disablesystemassertions` or `-dsa`
:   Disables assertions in all system classes.

`-enableassertions`\[`:`\[*packagename*\]...\|`:`*classname*\] or `-ea`\[`:`\[*packagename*\]...\|`:`*classname*\]
:   Enables assertions. By default, assertions are disabled in all packages and
    classes. With no arguments, `-enableassertions` (`-ea`) enables assertions
    in all packages and classes. With the *packagename* argument ending in
    `...`, the switch enables assertions in the specified package and any
    subpackages. If the argument is simply `...`, then the switch enables
    assertions in the unnamed package in the current working directory. With
    the *classname* argument, the switch enables assertions in the specified
    class.

    The `-enableassertions` (`-ea`) option applies to all class loaders and to
    system classes (which don't have a class loader). There's one exception to
    this rule: If the option is provided with no arguments, then it doesn't
    apply to system classes. This makes it easy to enable assertions in all
    classes except for system classes. The `-enablesystemassertions` option
    provides a separate switch to enable assertions in all system classes. To
    explicitly disable assertions in specific packages or classes, use the
    `-disableassertions` (`-da`) option. If a single command contains multiple
    instances of these switches, then they're processed in order, before
    loading any classes. For example, to run the `MyClass` application with
    assertions enabled only in the package `com.wombat.fruitbat` (and any
    subpackages) but disabled in the class `com.wombat.fruitbat.Brickbat`, use
    the following command:

    >   `java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat
        MyClass`

`-enablesystemassertions` or `-esa`
:   Enables assertions in all system classes.

`-help`, `-h`, or `-?`
:   Prints the help message to the error stream.

`--help`
:   Prints the help message to the output stream.

`-javaagent:`*jarpath*\[`=`*options*\]
:   Loads the specified Java programming language agent. See `java.lang.instrument`.

`--show-version`
:   Prints the product version to the output stream and continues.

`-showversion`
:   Prints the product version to the error stream and continues.

`--show-module-resolution`
:   Shows module resolution output during startup.

`-splash:`*imagepath*
:   Shows the splash screen with the image specified by *imagepath*. HiDPI
    scaled images are automatically supported and used if available. The
    unscaled image file name, such as `image.ext`, should always be passed as
    the argument to the `-splash` option. The most appropriate scaled image
    provided is picked up automatically.

    For example, to show the `splash.gif` file from the `images` directory when
    starting your application, use the following option:

    >   `-splash:images/splash.gif`

    See the SplashScreen API documentation for more information.

`-verbose:class`
:   Displays information about each loaded class.

`-verbose:gc`
:   Displays information about each garbage collection (GC) event.

`-verbose:jni`
:   Displays information about the use of native methods and other Java Native
    Interface (JNI) activity.

`-verbose:module`
:   Displays information about the modules in use.

`--version`
:   Prints product version to the output stream and exits.

`-version`
:   Prints product version to the error stream and exits.

`-X`
:   Prints the help on extra options to the error stream.

`--help-extra`
:   Prints the help on extra options to the output stream.

`@`*argfile*
:   Specifies one or more argument files prefixed by `@` used by the `java`
    command. It isn't uncommon for the `java` command line to be very long
    because of the `.jar` files needed in the classpath. The `@`*argfile*
    option overcomes command-line length limitations by enabling the launcher
    to expand the contents of argument files after shell expansion, but before
    argument processing. Contents in the argument files are expanded because
    otherwise, they would be specified on the command line until the
    `--disable-@files` option was encountered.

    The argument files can also contain the main class name and all options. If
    an argument file contains all of the options required by the `java`
    command, then the command line could simply be:

    >   `java @`*argfile*

    See [java Command-Line Argument Files] for a description and examples of
    using `@`-argfiles.

## Extra Options for Java

The following `java` options are general purpose options that are specific to
the Java HotSpot Virtual Machine.

`-Xbatch`
:   Disables background compilation. By default, the JVM compiles the method as
    a background task, running the method in interpreter mode until the
    background compilation is finished. The `-Xbatch` flag disables background
    compilation so that compilation of all methods proceeds as a foreground
    task until completed. This option is equivalent to
    `-XX:-BackgroundCompilation`.

`-Xbootclasspath/a:`*directories*\|*zip*\|*JAR-files*
:   Specifies a list of directories, JAR files, and ZIP archives to append to
    the end of the default bootstrap class path.

    On Windows, semicolons (`;`) separate entities in this list;
    on other platforms it is a colon (`:`).

`-Xcheck:jni`
:   Performs additional checks for Java Native Interface (JNI) functions.

    The following checks are considered indicative of significant problems
    with the native code, and the JVM terminates with an irrecoverable
    error in such cases:

    - The thread doing the call is not attached to the JVM.
    - The thread doing the call is using the `JNIEnv` belonging to another
      thread.
    - A parameter validation check fails:
      - A `jfieldID`, or `jmethodID`, is detected as being invalid. For example:
        - Of the wrong type
        - Associated with the wrong class
      - A parameter of the wrong type is detected.
      - An invalid parameter value is detected. For example:
        - NULL where not permitted
        - An out-of-bounds array index, or frame capacity
        - A non-UTF-8 string
        - An invalid JNI reference
        - An attempt to use a `ReleaseXXX` function on a parameter not
          produced by the corresponding `GetXXX` function

    The following checks only result in warnings being printed:

    - A JNI call was made without checking for a pending exception from a
      previous JNI call, and the current call is not safe when an exception
      may be pending.
    - A class descriptor is in decorated format (`Lname;`) when it should not be.
    - A `NULL` parameter is allowed, but its use is questionable.
    - Calling other JNI functions in the scope of `Get/ReleasePrimitiveArrayCritical`
      or `Get/ReleaseStringCritical`

    Expect a performance degradation when this option is used.

`-Xcomp`
:   Testing mode to exercise JIT compilers. This option should not be used in production environments.

`-Xdebug`
:   Does nothing; deprecated for removal in a future release.

`-Xdiag`
:   Shows additional diagnostic messages.

`-Xint`
:   Runs the application in interpreted-only mode. Compilation to native code
    is disabled, and all bytecode is executed by the interpreter. The
    performance benefits offered by the just-in-time (JIT) compiler aren't
    present in this mode.

`-Xinternalversion`
:   Displays more detailed JVM version information than the `-version` option,
    and then exits.

`-Xlog:`*option*
:   Configure or enable logging with the Java Virtual Machine (JVM) unified
    logging framework. See [Enable Logging with the JVM Unified Logging
    Framework].

`-Xmixed`
:   Executes all bytecode by the interpreter except for hot methods, which are
    compiled to native code. On by default. Use `-Xint` to switch off.

`-Xmn` *size*
:   Sets the initial and maximum size (in bytes) of the heap for the young
    generation (nursery) in the generational collectors. Append the letter
    `k` or `K` to indicate kilobytes, `m` or `M` to indicate megabytes, or
    `g` or `G` to indicate gigabytes. The young generation region of the heap
    is used for new objects. GC is performed in this region more often than
    in other regions. If the size for the young generation is too small, then
    a lot of minor garbage collections are performed. If the size is too large,
    then only full garbage collections are performed, which can take a long
    time to complete. It is recommended that you do not set the size for the
    young generation for the G1 collector, and keep the size for the young
    generation greater than 25% and less than 50% of the overall heap size for
    other collectors.
    The following examples show how to set the initial and maximum size of
    young generation to 256 MB using various units:

    ```
    -Xmn256m
    -Xmn262144k
    -Xmn268435456
    ```

    Instead of the `-Xmn` option to set both the initial and maximum size of
    the heap for the young generation, you can use `-XX:NewSize` to set the
    initial size and `-XX:MaxNewSize` to set the maximum size.

`-Xms` *size*
:   Sets the minimum and the initial size (in bytes) of the heap. This value
    must be a multiple of 1024 and greater than 1 MB. Append the letter `k` or
    `K` to indicate kilobytes, `m` or `M` to indicate megabytes, or `g` or `G`
    to indicate gigabytes. The following examples show how to set the size of
    allocated memory to 6 MB using various units:

    ```
    -Xms6291456
    -Xms6144k
    -Xms6m
    ```

    If you do not set this option, then the initial size will be set as the sum
    of the sizes allocated for the old generation and the young generation. The
    initial size of the heap for the young generation can be set using the
    `-Xmn` option or the `-XX:NewSize` option.

    Note that the `-XX:InitialHeapSize` option can also be used to set the
    initial heap size. If it appears after `-Xms` on the command line, then the
    initial heap size gets set to the value specified with `-XX:InitialHeapSize`.

`-Xmx` *size*
:   Specifies the maximum size (in bytes) of the heap. This value
    must be a multiple of 1024 and greater than 2 MB. Append the letter `k` or
    `K` to indicate kilobytes, `m` or `M` to indicate megabytes, or `g` or `G`
    to indicate gigabytes. The default value is chosen at runtime based on system
    configuration. For server deployments, `-Xms` and `-Xmx` are often set to
    the same value. The following examples show how to set the maximum allowed
    size of allocated memory to 80 MB using various units:

    ```
    -Xmx83886080
    -Xmx81920k
    -Xmx80m
    ```

    The `-Xmx` option is equivalent to `-XX:MaxHeapSize`.

`-Xnoclassgc`
:   Disables garbage collection (GC) of classes. This can save some GC time,
    which shortens interruptions during the application run. When you specify
    `-Xnoclassgc` at startup, the class objects in the application are left
    untouched during GC and are always be considered live. This can result in
    more memory being permanently occupied which, if not used carefully, throws
    an out-of-memory exception.

`-Xrs`
:   Reduces the use of operating system signals by the JVM. Shutdown hooks
    enable the orderly shutdown of a Java application by running user cleanup
    code (such as closing database connections) at shutdown, even if the JVM
    terminates abruptly.

    -   **Non-Windows:**

        -   The JVM catches signals to implement shutdown hooks for unexpected
            termination. The JVM uses `SIGHUP`, `SIGINT`, and `SIGTERM` to
            initiate the running of shutdown hooks.

        -   Applications embedding the JVM frequently need to trap signals such
            as `SIGINT` or `SIGTERM`, which can lead to interference with the
            JVM signal handlers. The `-Xrs` option is available to address this
            issue. When `-Xrs` is used, the signal masks for `SIGINT`,
            `SIGTERM`, `SIGHUP`, and `SIGQUIT` aren't changed by the JVM, and
            signal handlers for these signals aren't installed.

    -   **Windows:**

        -   The JVM watches for console control events to implement shutdown
            hooks for unexpected termination. Specifically, the JVM registers a
            console control handler that begins shutdown-hook processing and
            returns `TRUE` for `CTRL_C_EVENT`, `CTRL_CLOSE_EVENT`,
            `CTRL_LOGOFF_EVENT`, and `CTRL_SHUTDOWN_EVENT`.

        -   The JVM uses a similar mechanism to implement the feature of
            dumping thread stacks for debugging purposes. The JVM uses
            `CTRL_BREAK_EVENT` to perform thread dumps.

        -   If the JVM is run as a service (for example, as a servlet engine
            for a web server), then it can receive `CTRL_LOGOFF_EVENT` but
            shouldn't initiate shutdown because the operating system doesn't
            actually terminate the process. To avoid possible interference such
            as this, the `-Xrs` option can be used. When the `-Xrs` option is
            used, the JVM doesn't install a console control handler, implying
            that it doesn't watch for or process `CTRL_C_EVENT`,
            `CTRL_CLOSE_EVENT`, `CTRL_LOGOFF_EVENT`, or `CTRL_SHUTDOWN_EVENT`.

    There are two consequences of specifying `-Xrs`:

    -   **Non-Windows:** `SIGQUIT` thread dumps aren't
        available.

    -   **Windows:** Ctrl + Break thread dumps aren't available.

    User code is responsible for causing shutdown hooks to run, for example, by
    calling `System.exit()` when the JVM is to be terminated.

`-Xshare:`*mode*
:   Sets the class data sharing (CDS) mode.

    Possible *mode* arguments for this option include the following:

    `auto`
    :   Use shared class data if possible (default).

    `on`
    :   Require using shared class data, otherwise fail.

    > **Note:** The `-Xshare:on` option is used for testing purposes only.
    It may cause the VM to unexpectedly exit during start-up when the CDS
    archive cannot be used (for example, when certain VM parameters are changed,
    or when a different JDK is used). This option should not be used
    in production environments.

    `off`
    :   Do not attempt to use shared class data.

`-XshowSettings`
:   Shows all settings and then continues.

`-XshowSettings:`*category*
:   Shows settings and continues. Possible *category* arguments for this option
    include the following:

    `all`
    :   Shows all categories of settings in **verbose** detail.

    `locale`
    :   Shows settings related to locale.

    `properties`
    :   Shows settings related to system properties.

    `security`
    :   Shows all settings related to security.

        sub-category arguments for `security` include the following:

        *   `security:all` : shows all security settings
        *   `security:properties` : shows security properties
        *   `security:providers` : shows static security provider settings
        *   `security:tls` : shows TLS related security settings

    `vm`
    :   Shows the settings of the JVM.

    `system`
    :   **Linux only:** Shows host system or container configuration and continues.

`-Xss` *size*
:   Sets the thread stack size (in bytes). Append the letter `k` or `K` to
    indicate KB, `m` or `M` to indicate MB, or `g` or `G` to indicate GB. The
    actual size may be rounded up to a multiple of the system page size as
    required by the operating system. The default value depends on the
    platform. For example:

    -   Linux/x64: 1024 KB

    -   Linux/Aarch64: 2048 KB

    -   macOS/x64: 1024 KB

    -   macOS/Aarch64: 2048 KB

    -   Windows: The default value depends on virtual memory

    The following examples set the thread stack size to 1024 KB in different
    units:

    ```
    -Xss1m
    -Xss1024k
    -Xss1048576
    ```

    This option is similar to `-XX:ThreadStackSize`.

`--add-reads` *module*`=`*target-module*(`,`*target-module*)\*
:   Updates *module* to read the *target-module*, regardless of the module
    declaration. *target-module* can be `ALL-UNNAMED` to read all unnamed
    modules.

`--add-exports` *module*`/`*package*`=`*target-module*(`,`*target-module*)\*
:   Updates *module* to export *package* to *target-module*, regardless of
    module declaration. *target-module* can be `ALL-UNNAMED` to export to all
    unnamed modules.

`--add-opens` *module*`/`*package*`=`*target-module*(`,`*target-module*)\*
:   Updates *module* to open *package* to *target-module*, regardless of module
    declaration.

`--limit-modules` *module*\[`,`*module*...\]
:   Specifies the limit of the universe of observable modules.

`--patch-module` *module*`=`*file*(`;`*file*)\*
:   Overrides or augments a module with classes and resources in JAR files or
    directories.

`--source` *version*
:   Sets the version of the source in source-file mode.


`--sun-misc-unsafe-memory-access=` *value*
:   Allow or deny usage of unsupported API `sun.misc.Unsafe`. *value* is one of:

    `allow`
    : Allow use of the memory-access methods with no warnings at run time.

    `warn`
    : Allow use of the memory-access methods, but issues a warning on the first
      occasion that any memory-access method is used. At most one warning is
      issued.

    `debug`
    : Allow use of the memory-access methods, but issue a one-line warning and
      a stack trace when any memory-access method is used.

    `deny`
    : Disallow use of the memory-access methods by throwing an
      `UnsupportedOperationException` on every usage.

    The default value when the option is not specified is `warn`.


## Extra Options for macOS

The following extra options are macOS specific.

`-XstartOnFirstThread`
:   Runs the `main()` method on the first (AppKit) thread.

`-Xdock:name=`*application\_name*
:   Overrides the default application name displayed in dock.

`-Xdock:icon=`*path\_to\_icon\_file*
:   Overrides the default icon displayed in dock.

## Advanced Options for Java

These `java` options can be used to enable other advanced options.

`-XX:+UnlockDiagnosticVMOptions`
:   Unlocks the options intended for diagnosing the JVM. By default, this
    option is disabled and diagnostic options aren't available.

    Command line options that are enabled with the use of this option are
    not supported. If you encounter issues while using any of these
    options, it is very likely that you will be required to reproduce the
    problem without using any of these unsupported options before Oracle
    Support can assist with an investigation. It is also possible that any
    of these options may be removed or their behavior changed without any
    warning.

`-XX:+UnlockExperimentalVMOptions`
:   Unlocks the options that provide experimental features in the JVM.
    By default, this option is disabled and experimental features aren't available.

## Advanced Runtime Options for Java

These `java` options control the runtime behavior of the Java HotSpot VM.

`-XX:ActiveProcessorCount=`*x*
:   Overrides the number of CPUs that the VM will use to calculate the size of
    thread pools it will use for various operations such as Garbage Collection
    and ForkJoinPool.

    The VM normally determines the number of available processors from the
    operating system. This flag can be useful for partitioning CPU resources
    when running multiple Java processes in docker containers. This flag is
    honored even if `UseContainerSupport` is not enabled. See
    `-XX:-UseContainerSupport` for a description of enabling and disabling
    container support.

`-XX:AllocateHeapAt=`*path*
:   Takes a path to the file system and uses memory mapping to allocate the
    object heap on the memory device. Using this option enables the HotSpot VM
    to allocate the Java object heap on an alternative memory device, such as
    an NV-DIMM, specified by the user.

    Alternative memory devices that have the same semantics as DRAM, including
    the semantics of atomic operations, can be used instead of DRAM for the
    object heap without changing the existing application code. All other
    memory structures (such as the code heap, metaspace, and thread stacks)
    continue to reside in DRAM.

    Some operating systems expose non-DRAM memory through the file system.
    Memory-mapped files in these file systems bypass the page cache and provide
    a direct mapping of virtual memory to the physical memory on the device.
    The existing heap related flags (such as `-Xmx` and `-Xms`) and
    garbage-collection related flags continue to work as before.

`-XX:-CompactStrings`
:   Disables the Compact Strings feature. By default, this option is enabled.
    When this option is enabled, Java Strings containing only single-byte
    characters are internally represented and stored as
    single-byte-per-character Strings using ISO-8859-1 / Latin-1 encoding. This
    reduces, by 50%, the amount of space required for Strings containing only
    single-byte characters. For Java Strings containing at least one multibyte
    character: these are represented and stored as 2 bytes per character using
    UTF-16 encoding. Disabling the Compact Strings feature forces the use of
    UTF-16 encoding as the internal representation for all Java Strings.

    Cases where it may be beneficial to disable Compact Strings include the
    following:

    -   When it's known that an application overwhelmingly will be allocating
        multibyte character Strings

    -   In the unexpected event where a performance regression is observed in
        migrating from Java SE 8 to Java SE 9 and an analysis shows that
        Compact Strings introduces the regression

    In both of these scenarios, disabling Compact Strings makes sense.

`-XX:ErrorFile=`*filename*
:   Specifies the path and file name to which error data is written when an
    irrecoverable error occurs. By default, this file is created in the current
    working directory and named `hs_err_pid`*pid*`.log` where *pid* is the
    identifier of the process that encountered the error.

    The following example shows how to set the default log file (note that the
    identifier of the process is specified as `%p`):

    >   `-XX:ErrorFile=./hs_err_pid%p.log`

    -   **Non-Windows:** The following example shows how to
        set the error log to `/var/log/java/java_error.log`:

        >   `-XX:ErrorFile=/var/log/java/java_error.log`

    -   **Windows:** The following example shows how to set the error log file
        to `C:/log/java/java_error.log`:

        >   `-XX:ErrorFile=C:/log/java/java_error.log`

    If the file exists, and is writeable, then it will be overwritten.
    Otherwise, if the file can't be created in the specified directory (due to
    insufficient space, permission problem, or another issue), then the file is
    created in the temporary directory for the operating system:

    -   **Non-Windows:** The temporary directory is `/tmp`.

    -   **Windows:** The temporary directory is specified by the value of the
        `TMP` environment variable; if that environment variable isn't defined,
        then the value of the `TEMP` environment variable is used.

`-XX:+ExtensiveErrorReports`
:   Enables the reporting of more extensive error information in the `ErrorFile`.
    This option can be turned on in environments where maximal information is
    desired - even if the resulting logs may be quite large and/or contain
    information that might be considered sensitive. The information can vary
    from release to release, and across different platforms. By default this
    option is disabled.

`-XX:FlightRecorderOptions=`*parameter*`=`*value* (or) `-XX:FlightRecorderOptions:`*parameter*`=`*value*
:   Sets the parameters that control the behavior of JFR. Multiple parameters can be specified
    by separating them with a comma.

    The following list contains the available JFR *parameter*`=`*value*
    entries:

    `globalbuffersize=`*size*
    :   Specifies the total amount of primary memory used for data retention.
        The default value is based on the value specified for `memorysize`.
        Change the `memorysize` parameter to alter the size of global buffers.

    `maxchunksize=`*size*
    :   Specifies the maximum size (in bytes) of the data chunks in a
        recording. Append `m` or `M` to specify the size in megabytes (MB), or
        `g` or `G` to specify the size in gigabytes (GB). By default, the
        maximum size of data chunks is set to 12 MB. The minimum allowed is 1
        MB.

    `memorysize=`*size*
    :   Determines how much buffer memory should be used, and sets the
        `globalbuffersize` and `numglobalbuffers` parameters based on the size
        specified. Append `m` or `M` to specify the size in megabytes (MB), or
        `g` or `G` to specify the size in gigabytes (GB). By default, the
        memory size is set to 10 MB.

    `numglobalbuffers`
    :   Specifies the number of global buffers used. The default value is based
        on the memory size specified. Change the `memorysize` parameter to
        alter the number of global buffers.

    `old-object-queue-size=number-of-objects`
    :   Maximum number of old objects to track. By default, the number of
        objects is set to 256.

    `preserve-repository=`{`true`\|`false`}
    :   Specifies whether files stored in the disk repository should be kept
        after the JVM has exited. If false, files are deleted. By default,
        this parameter is disabled.

    `repository=`*path*
    :   Specifies the repository (a directory) for temporary disk storage. By
        default, the system's temporary directory is used.

    `retransform=`{`true`\|`false`}
    :   Specifies whether event classes should be retransformed using JVMTI. If
        false, instrumentation is added when event classes are loaded. By
        default, this parameter is enabled.

    `stackdepth=`*depth*
    :   Stack depth for stack traces. By default, the depth is set to 64 method
        calls. The maximum is 2048. Values greater than 64 could create
        significant overhead and reduce performance.

    `threadbuffersize=`*size*
    :   Specifies the per-thread local buffer size (in bytes). By default, the
        local buffer size is set to 8 kilobytes, with a minimum value of
        4 kilobytes. Overriding this parameter
        could reduce performance and is not recommended.

`-XX:LargePageSizeInBytes=`*size*
:   Sets the maximum large page size (in bytes) used by the JVM. The
    *size* argument must be a valid page size supported by the environment
    to have any effect. Append the letter `k` or `K` to indicate kilobytes,
    `m` or `M` to indicate megabytes, or `g` or `G` to indicate gigabytes.
    By default, the size is set to 0, meaning that the JVM will use the
    default large page size for the environment as the maximum size for
    large pages. See [Large Pages].

    The following example describes how to set the large page size to 1
    gigabyte (GB):

    >   `-XX:LargePageSizeInBytes=1g`

`-XX:MaxDirectMemorySize=`*size*
:   Sets the maximum total size (in bytes) of the `java.nio` package,
    direct-buffer allocations. Append the letter `k` or `K` to indicate
    kilobytes, `m` or `M` to indicate megabytes, or `g` or `G` to indicate
    gigabytes. If not set, the flag is ignored and the JVM chooses the size
    for NIO direct-buffer allocations automatically.

    The following examples illustrate how to set the NIO size to 1024 KB in
    different units:

    ```
    -XX:MaxDirectMemorySize=1m
    -XX:MaxDirectMemorySize=1024k
    -XX:MaxDirectMemorySize=1048576
    ```

`-XX:-MaxFDLimit`
:   Disables the attempt to set the soft limit for the number of open file
    descriptors to the hard limit. By default, this option is enabled on all
    platforms, but is ignored on Windows. The only time that you may need to
    disable this is on macOS, where its use imposes a maximum of 10240, which
    is lower than the actual system maximum.

`-XX:NativeMemoryTracking=`*mode*
:   Specifies the mode for tracking JVM native memory usage. Possible *mode*
    arguments for this option include the following:

    `off`
    :   Instructs not to track JVM native memory usage. This is the default
        behavior if you don't specify the `-XX:NativeMemoryTracking` option.

    `summary`
    :   Tracks memory usage only by JVM subsystems, such as Java heap, class,
        code, and thread.

    `detail`
    :   In addition to tracking memory usage by JVM subsystems, track memory
        usage by individual `CallSite`, individual virtual memory region and
        its committed regions.

`-XX:TrimNativeHeapInterval=`*millis*
:   Interval, in ms, at which the JVM will trim the native heap. Lower values
    will reclaim memory more eagerly at the cost of higher overhead. A value
    of 0 (default) disables native heap trimming.
    Native heap trimming is performed in a dedicated thread.

    This option is only supported on Linux with GNU C Library (glibc).

`-XX:+NeverActAsServerClassMachine`
:   Enable the "Client VM emulation" mode which only uses the C1 JIT compiler,
    a 32Mb CodeCache and the Serial GC. The maximum amount of memory that the
    JVM may use (controlled by the `-XX:MaxRAM=n` flag) is set to 1GB by default.
    The string "emulated-client" is added to the JVM version string.

    By default the flag is set to `true` only on Windows in 32-bit mode and
    `false` in all other cases.

    The "Client VM emulation" mode will not be enabled if any of the following
    flags are used on the command line:

    ```
    -XX:{+|-}TieredCompilation
    -XX:CompilationMode=mode
    -XX:TieredStopAtLevel=n
    -XX:{+|-}EnableJVMCI
    -XX:{+|-}UseJVMCICompiler
    ```

`-XX:ObjectAlignmentInBytes=`*alignment*
:   Sets the memory alignment of Java objects (in bytes). By default, the value
    is set to 8 bytes. The specified value should be a power of 2, and must be
    within the range of 8 and 256 (inclusive). This option makes it possible to
    use compressed pointers with large Java heap sizes.

    The heap size limit in bytes is calculated as:

    >   `4GB * ObjectAlignmentInBytes`

    > **Note:** As the alignment value increases, the unused space between objects also
    increases. As a result, you may not realize any benefits from using
    compressed pointers with large Java heap sizes.

`-XX:OnError=`*string*
:   Sets a custom command or a series of semicolon-separated commands to run
    when an irrecoverable error occurs. If the string contains spaces, then it
    must be enclosed in quotation marks.

    -   **Non-Windows:** The following example shows how
        the `-XX:OnError` option can be used to run the `gcore` command to
        create a core image, and start the `gdb` debugger to attach to the
        process in case of an irrecoverable error (the `%p` designates the
        current process identifier):

        >   `-XX:OnError="gcore %p;gdb -p %p"`

    -   **Windows:** The following example shows how the `-XX:OnError` option
        can be used to run the `userdump.exe` utility to obtain a crash dump in
        case of an irrecoverable error (the `%p` designates the current
        process identifier). This example assumes that the path to the `userdump.exe`
        utility is specified in the `PATH` environment variable:

        >   `-XX:OnError="userdump.exe %p"`

`-XX:OnOutOfMemoryError=`*string*
:   Sets a custom command or a series of semicolon-separated commands to run
    when an `OutOfMemoryError` exception is first thrown by the JVM.
    If the string
    contains spaces, then it must be enclosed in quotation marks. For an
    example of a command string, see the description of the `-XX:OnError`
    option.
    This applies only to `OutOfMemoryError` exceptions caused by Java Heap
    exhaustion; it does not apply to `OutOfMemoryError` exceptions thrown
    directly from Java code, nor by the JVM for other types of resource
    exhaustion (such as native thread creation errors).

`-XX:+PrintCommandLineFlags`
:   Enables printing of ergonomically selected JVM flags that appeared on the
    command line. It can be useful to know the ergonomic values set by the JVM,
    such as the heap space size and the selected garbage collector. By default,
    this option is disabled and flags aren't printed.

`-XX:+PreserveFramePointer`
:   Selects between using the RBP register as a general purpose register
    (`-XX:-PreserveFramePointer`) and using the RBP register to hold the frame
    pointer of the currently executing method (`-XX:+PreserveFramePointer`). If
    the frame pointer is available, then external profiling tools (for example,
    Linux perf) can construct more accurate stack traces.

`-XX:+PrintNMTStatistics`
:   Enables printing of collected native memory tracking data at JVM exit when
    native memory tracking is enabled (see `-XX:NativeMemoryTracking`). By
    default, this option is disabled and native memory tracking data isn't
    printed.

`-XX:SharedArchiveFile=`*path*
:   Specifies the path and name of the class data sharing (CDS) archive file

    See [Application Class Data Sharing].

`-XX:+VerifySharedSpaces`
:   If this option is specified, the JVM will load a CDS archive file only if it
    passes an integrity check based on CRC32 checksums. The purpose of this flag is
    to check for unintentional damage to CDS archive files in transmission or storage.
    To guarantee the security and proper operation of CDS, the user must
    ensure that the CDS archive files used by Java applications cannot be modified without
    proper authorization.

`-XX:SharedArchiveConfigFile=`*shared\_config\_file*
:   Specifies additional shared data added to the archive file.

`-XX:SharedClassListFile=`*file\_name*
:   Specifies the text file that contains the names of the classes to store in
    the class data sharing (CDS) archive. This file contains the full name of
    one class per line, except slashes (`/`) replace dots (`.`). For example,
    to specify the classes `java.lang.Object` and `hello.Main`, create a text
    file that contains the following two lines:

    ```
    java/lang/Object
    hello/Main
    ```

    The classes that you specify in this text file should include the classes
    that are commonly used by the application. They may include any classes
    from the application, extension, or bootstrap class paths.

    See [Application Class Data Sharing].

`-XX:+ShowCodeDetailsInExceptionMessages`
:   Enables printing of improved `NullPointerException` messages. When an application throws a
    `NullPointerException`, the option enables the JVM to analyze the program's bytecode
    instructions to determine precisely which reference is `null`,
    and describes the source with a null-detail message.
    The null-detail message is calculated and returned by `NullPointerException.getMessage()`,
    and will be printed as the exception message along with
    the method, filename, and line number. By default, this option is enabled.

`-XX:+ShowMessageBoxOnError`
:   Enables the display of a dialog box when the JVM experiences an
    irrecoverable error. This prevents the JVM from exiting and keeps the
    process active so that you can attach a debugger to it to investigate the
    cause of the error. By default, this option is disabled.

`-XX:StartFlightRecording:`*parameter*`=`*value*
:   Starts a JFR recording for the Java application. This option is equivalent
    to the `JFR.start` diagnostic command that starts a recording during
    runtime. `-XX:StartFlightRecording:help` prints available options and
    example command lines. You can set the following *parameter*`=`*value*
    entries when starting a JFR recording:

    `delay=`*time*
    :   Specifies the delay between the Java application launch time and the
        start of the recording. Append `s` to specify the time in seconds, `m`
        for minutes, `h` for hours, or `d` for days (for example, specifying
        `10m` means 10 minutes). By default, there's no delay, and this
        parameter is set to 0.

    `disk=`{`true`\|`false`}
    :   Specifies whether to write data to disk while recording. By default,
        this parameter is enabled.

    `dumponexit=`{`true`\|`false`}
    :   Specifies if the running recording is dumped when the JVM shuts down.
        If enabled and a `filename` is not entered, the recording is written to
        a file in the directory where the process was started. The file name is
        a system-generated name that contains the process ID, recording ID, and
        current timestamp, similar to
        `hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr`. By default, this
        parameter is disabled.

    `duration=`*time*
    :   Specifies the duration of the recording. Append `s` to specify the time
        in seconds, `m` for minutes, `h` for hours, or `d` for days (for
        example, specifying `5h` means 5 hours). By default, the duration isn't
        limited, and this parameter is set to 0.

    `filename=`*path*
    :   Specifies the path and name of the file to which the recording is
        written when the recording is stopped, for example:

        -   `recording.jfr`
        -   `/home/user/recordings/recording.jfr`
        -   `c:\recordings\recording.jfr`

        If %p and/or %t is specified in the filename, it expands to the JVM's
        PID and the current timestamp, respectively. The filename may also be
        a directory in which case, the filename is generated from the PID
        and the current date in the specified directory.

    `name=`*identifier*
    :   Takes both the name and the identifier of a recording.

    `maxage=`*time*
    :   Specifies the maximum age of disk data to keep for the recording. This
        parameter is valid only when the `disk` parameter is set to `true`.
        Append `s` to specify the time in seconds, `m` for minutes, `h` for
        hours, or `d` for days (for example, specifying `30s` means 30
        seconds). By default, the maximum age isn't limited, and this parameter
        is set to `0s`.

    `maxsize=`*size*
    :   Specifies the maximum size (in bytes) of disk data to keep for the
        recording. This parameter is valid only when the `disk` parameter is
        set to `true`. The value must not be less than the value for the
        `maxchunksize` parameter set with `-XX:FlightRecorderOptions`. Append
        `m` or `M` to specify the size in megabytes, or `g` or `G` to specify
        the size in gigabytes. By default, the maximum size of disk data isn't
        limited, and this parameter is set to `0`.

    `path-to-gc-roots=`{`true`\|`false`}
    :   Specifies whether to collect the path to garbage collection (GC) roots
        at the end of a recording. By default, this parameter is disabled.

        The path to GC roots is useful for finding memory leaks, but collecting
        it is time-consuming. Enable this option only when you start a
        recording for an application that you suspect has a memory leak. If the
        `settings` parameter is set to `profile`, the stack trace from where
        the potential leaking object was allocated is included in the
        information collected.

    `report-on-exit=`*identifier*
    :   Specifies the name of the view to display when the Java Virtual Machine
        (JVM) shuts down. To specify more than one view, use the report-on-exit
        parameter repeatedly. This option is not available if the disk option
        is set to false. For a list of available views, see `jfr help view`.
        By default, no report is generated.

    `settings=`*path*
    :   Specifies the path and name of the event settings file (of type JFC).
        By default, the `default.jfc` file is used, which is located in
        `JAVA_HOME/lib/jfr`. This default settings file collects a predefined
        set of information with low overhead, so it has minimal impact on
        performance and can be used with recordings that run continuously.

        A second settings file is also provided, profile.jfc, which provides
        more data than the default configuration, but can have more overhead
        and impact performance. Use this configuration for short periods of
        time when more information is needed.

    You can specify values for multiple parameters by separating them with a
    comma. Event settings and .jfc options can be specified using the
    following syntax:

    `option=`*value*
    :   Specifies the option value to modify. To list available options, use
        the `JAVA_HOME`/bin/jfr tool.

    `event-setting=`*value*
    :   Specifies the event setting value to modify. Use the form:
        `<event-name>#<setting-name>=<value>`.
        To add a new event setting, prefix the event name with '+'.

    You can specify values for multiple event settings and .jfc options by
    separating them with a comma. In case of a conflict between a parameter
    and a .jfc option, the parameter will take precedence. The whitespace
    delimiter can be omitted for timespan values, i.e. 20ms. For more
    information about the settings syntax, see Javadoc of the jdk.jfr
    package.

    To only see warnings and errors from JFR during startup set
    -Xlog:jfr+startup=warning.

`-XX:ThreadStackSize=`*size*
:   Sets the Java thread stack size (in kilobytes). Use of a scaling suffix,
    such as `k`, results in the scaling of the kilobytes value so that
    `-XX:ThreadStackSize=1k` sets the Java thread stack size to 1024\*1024
    bytes or 1 megabyte. The default value depends on the platform. For example:

    -   Linux/x64: 1024 KB

    -   Linux/Aarch64: 2048 KB

    -   macOS/x64: 1024 KB

    -   macOS/Aarch64: 2048 KB

    -   Windows: The default value depends on virtual memory

    The following examples show how to set the thread stack size to 1 megabyte
    in different units:

    ```
    -XX:ThreadStackSize=1k
    -XX:ThreadStackSize=1024
    ```

    This option is similar to `-Xss`.

`-XX:+UseCompactObjectHeaders`
:   Enables compact object headers. By default, this option is disabled.
    Enabling this option reduces memory footprint in the Java heap by
    4 bytes per object (on average) and often improves performance.

    The feature remains disabled by default while it continues to be evaluated.
    In a future release it is expected to be enabled by default, and
    eventually will be the only mode of operation.

`-XX:-UseCompressedOops`
:   Disables the use of compressed pointers. By default, this option is
    enabled, and compressed pointers are used. This will automatically limit
    the maximum ergonomically determined Java heap size to the maximum amount
    of memory that can be covered by compressed pointers. By default this range
    is 32 GB.

    With compressed oops enabled, object references are represented
    as 32-bit offsets instead of 64-bit pointers, which typically increases
    performance when running the application with Java heap sizes smaller than
    the compressed oops pointer range. This option works only for 64-bit JVMs.

    It's possible to use compressed pointers with Java heap sizes greater than
    32 GB. See the `-XX:ObjectAlignmentInBytes` option.

`-XX:-UseContainerSupport`
:   **Linux only:** The VM now provides automatic container detection support, which allows the
    VM to determine the amount of memory and number of processors that are
    available to a Java process running in docker containers. It uses this
    information to allocate system resources. The default for this flag is `true`,
    and container support is enabled by default. It can be disabled
    with `-XX:-UseContainerSupport`.

    Unified Logging is available to help to diagnose issues related to this
    support.

    Use `-Xlog:os+container=trace` for maximum logging of container
    information. See [Enable Logging with the JVM Unified Logging Framework]
    for a description of using Unified Logging.

`-XX:+UseLargePages`
:   Enables the use of large page memory. By default, this option is disabled
    and large page memory isn't used.

    See [Large Pages].

`-XX:+UseTransparentHugePages`
:   **Linux only:** Enables the use of large pages that can dynamically grow or
    shrink. This option is disabled by default. You may encounter performance
    problems with transparent huge pages as the OS moves other pages around to
    create huge pages; this option is made available for experimentation.

`-XX:+AllowUserSignalHandlers`
:   **Non-Windows:** Enables installation of signal handlers by the application. By default,
    this option is disabled and the application isn't allowed to install signal
    handlers.

`-XX:VMOptionsFile=`*filename*
:   Allows user to specify VM options in a file, for example,
    `java -XX:VMOptionsFile=/var/my_vm_options HelloWorld`.

`-XX:UseBranchProtection=`*mode*
:   **Linux AArch64 only:** Specifies the branch protection mode.
    All options other than
    `none` require the VM to have been built with branch protection
    enabled. In addition, for full protection, any native libraries
    provided by applications should be compiled with the same level
    of protection.

    Possible *mode* arguments for this option include the following:

    `none`
    : Do not use branch protection. This is the default value.

    `standard`
    : Enables all branch protection modes available on the current platform.

    `pac-ret`
    : Enables protection against ROP based attacks. (AArch64 8.3+ only)

## Advanced JIT Compiler Options for java

These `java` options control the dynamic just-in-time (JIT) compilation
performed by the Java HotSpot VM.

`-XX:AllocateInstancePrefetchLines=`*lines*
:   Sets the number of lines to prefetch ahead of the instance allocation
    pointer. By default, the number of lines to prefetch is set to 1:

    >   `-XX:AllocateInstancePrefetchLines=1`


`-XX:AllocatePrefetchDistance=`*size*
:   Sets the size (in bytes) of the prefetch distance for object allocation.
    Memory about to be written with the value of new objects is prefetched up
    to this distance starting from the address of the last allocated object.
    Each Java thread has its own allocation point.

    Negative values denote that prefetch distance is chosen based on the
    platform. Positive values are bytes to prefetch. Append the letter `k` or
    `K` to indicate kilobytes, `m` or `M` to indicate megabytes, or `g` or `G`
    to indicate gigabytes. The default value is set to -1.

    The following example shows how to set the prefetch distance to 1024 bytes:

    >   `-XX:AllocatePrefetchDistance=1024`


`-XX:AllocatePrefetchInstr=`*instruction*
:   Sets the prefetch instruction to prefetch ahead of the allocation pointer.
    Possible values are from 0 to 3. The actual instructions behind the values
    depend on the platform. By default, the prefetch instruction is set to 0:

    >   `-XX:AllocatePrefetchInstr=0`


`-XX:AllocatePrefetchLines=`*lines*
:   Sets the number of cache lines to load after the last object allocation by
    using the prefetch instructions generated in compiled code. The default
    value is 1 if the last allocated object was an instance, and 3 if it was an
    array.

    The following example shows how to set the number of loaded cache lines to
    5:

    >   `-XX:AllocatePrefetchLines=5`


`-XX:AllocatePrefetchStepSize=`*size*
:   Sets the step size (in bytes) for sequential prefetch instructions. Append
    the letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate
    megabytes, `g` or `G` to indicate gigabytes. By default, the step size is
    set to 16 bytes:

    >   `-XX:AllocatePrefetchStepSize=16`


`-XX:AllocatePrefetchStyle=`*style*
:   Sets the generated code style for prefetch instructions. The *style*
    argument is an integer from 0 to 3:

    `0`
    :   Don't generate prefetch instructions.

    `1`
    :   Execute prefetch instructions after each allocation. This is the
        default setting.

    `2`
    :   Use the thread-local allocation block (TLAB) watermark pointer to
        determine when prefetch instructions are executed.

    `3`
    :   Generate one prefetch instruction per cache line.


`-XX:+BackgroundCompilation`
:   Enables background compilation. This option is enabled by default. To
    disable background compilation, specify `-XX:-BackgroundCompilation` (this
    is equivalent to specifying `-Xbatch`).

`-XX:CICompilerCount=`*threads*
:   Sets the number of compiler threads to use for compilation.
    By default, the number of compiler threads is selected automatically
    depending on the number of CPUs and memory available for compiled code.
    The following example shows how to set the number of threads to 2:

    >   `-XX:CICompilerCount=2`

`-XX:+UseDynamicNumberOfCompilerThreads`
:   Dynamically create compiler thread up to the limit specified by `-XX:CICompilerCount`.
    This option is enabled by default.

`-XX:CompileCommand=`*command*`,`*method*\[`,`*option*\]
:   Specifies a *command* to perform on a *method*. For example, to exclude the
    `indexOf()` method of the `String` class from being compiled, use the
    following:

    >   `-XX:CompileCommand=exclude,java/lang/String.indexOf`

    Note that the full class name is specified, including all packages and
    subpackages separated by a slash (`/`). For easier cut-and-paste
    operations, it's also possible to use the method name format produced by
    the `-XX:+PrintCompilation` and `-XX:+LogCompilation` options:

    >   `-XX:CompileCommand=exclude,java.lang.String::indexOf`

    If the method is specified without the signature, then the command is
    applied to all methods with the specified name. However, you can also
    specify the signature of the method in the class file format. In this case,
    you should enclose the arguments in quotation marks, because otherwise the
    shell treats the semicolon as a command end. For example, if you want to
    exclude only the `indexOf(String)` method of the `String` class from being
    compiled, use the following:

    >   `-XX:CompileCommand="exclude,java/lang/String.indexOf,(Ljava/lang/String;)I"`

    You can also use the asterisk (\*) as a wildcard for class and method
    names. For example, to exclude all `indexOf()` methods in all classes from
    being compiled, use the following:

    >   `-XX:CompileCommand=exclude,*.indexOf`

    The commas and periods are aliases for spaces, making it easier to pass
    compiler commands through a shell. You can pass arguments to
    `-XX:CompileCommand` using spaces as separators by enclosing the argument
    in quotation marks:

    >   `-XX:CompileCommand="exclude java/lang/String indexOf"`

    Note that after parsing the commands passed on the command line using the
    `-XX:CompileCommand` options, the JIT compiler then reads commands from the
    `.hotspot_compiler` file. You can add commands to this file or specify a
    different file using the `-XX:CompileCommandFile` option.

    To add several commands, either specify the `-XX:CompileCommand` option
    multiple times, or separate each argument with the new line separator
    (`\n`). The following commands are available:

    `break`
    :   Sets a breakpoint when debugging the JVM to stop at the beginning of
        compilation of the specified method.

    `compileonly`
    :   Excludes all methods from compilation except for the specified method.
        As an alternative, you can use the `-XX:CompileOnly` option, which lets
        you specify several methods.

    `dontinline`
    :   Prevents inlining of the specified method.

    `exclude`
    :   Excludes the specified method from compilation.

    `help`
    :   Prints a help message for the `-XX:CompileCommand` option.

    `inline`
    :   Attempts to inline the specified method.

    `log`
    :   Excludes compilation logging (with the `-XX:+LogCompilation` option)
        for all methods except for the specified method. By default, logging is
        performed for all compiled methods.

    `option`
    :   Passes a JIT compilation option to the specified method in place of the
        last argument (`option`). The compilation option is set at the end,
        after the method name. For example, to enable the
        `BlockLayoutByFrequency` option for the `append()` method of the
        `StringBuffer` class, use the following:

        >   `-XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency`

        You can specify multiple compilation options, separated by commas or
        spaces.

    `print`
    :   Prints generated assembler code after compilation of the specified
        method.

    `quiet`
    :   Instructs not to print the compile commands. By default, the commands
        that you specify with the `-XX:CompileCommand` option are printed; for
        example, if you exclude from compilation the `indexOf()` method of the
        `String` class, then the following is printed to standard output:

        >   `CompilerOracle: exclude java/lang/String.indexOf`

        You can suppress this by specifying the `-XX:CompileCommand=quiet`
        option before other `-XX:CompileCommand` options.

`-XX:CompileCommandFile=`*filename*
:   Sets the file from which JIT compiler commands are read. By default, the
    `.hotspot_compiler` file is used to store commands performed by the JIT
    compiler.

    Each line in the command file represents a command, a class name, and a
    method name for which the command is used. For example, this line prints
    assembly code for the `toString()` method of the `String` class:

    >   `print java/lang/String toString`

    If you're using commands for the JIT compiler to perform on methods, then
    see the `-XX:CompileCommand` option.

`-XX:CompilerDirectivesFile=`*file*
:   Adds directives from a file to the directives stack when a program starts.
    See [Compiler Control](https://docs.oracle.com/en/java/javase/12/vm/compiler-control1.html#GUID-94AD8194-786A-4F19-BFFF-278F8E237F3A).

    The `-XX:CompilerDirectivesFile` option has to be used together with the
    `-XX:UnlockDiagnosticVMOptions` option that unlocks diagnostic JVM options.


`-XX:+CompilerDirectivesPrint`
:   Prints the directives stack when the program starts or when a new directive
    is added.

    The `-XX:+CompilerDirectivesPrint` option has to be used together with the
    `-XX:UnlockDiagnosticVMOptions` option that unlocks diagnostic JVM options.

`-XX:CompileOnly=`*methods*
:   Sets the list of methods (separated by commas) to which compilation should
    be restricted. Only the specified methods are compiled.

    `-XX:CompileOnly=method1,method2,...,methodN` is an alias for:
    ```
    -XX:CompileCommand=compileonly,method1
    -XX:CompileCommand=compileonly,method2
    ...
    -XX:CompileCommand=compileonly,methodN
    ```

`-XX:CompileThresholdScaling=`*scale*
:   Provides unified control of first compilation. This option controls when
    methods are first compiled for both the tiered and the nontiered modes of
    operation. The `CompileThresholdScaling` option has a floating point value
    between 0 and +Inf and scales the thresholds corresponding to the current
    mode of operation (both tiered and nontiered). Setting
    `CompileThresholdScaling` to a value less than 1.0 results in earlier
    compilation while values greater than 1.0 delay compilation. Setting
    `CompileThresholdScaling` to 0 is equivalent to disabling compilation.

`-XX:+DoEscapeAnalysis`
:   Enables the use of escape analysis. This option is enabled by default. To
    disable the use of escape analysis, specify `-XX:-DoEscapeAnalysis`.

`-XX:InitialCodeCacheSize=`*size*
:   Sets the initial code cache size (in bytes). Append the letter `k` or `K`
    to indicate kilobytes, `m` or `M` to indicate megabytes, or `g` or `G` to
    indicate gigabytes. The default value depends on the platform. The initial code
    cache size shouldn't be less than the system's minimal memory page size.
    The following example shows how to set the initial code cache size to 32
    KB:

    >   `-XX:InitialCodeCacheSize=32k`

`-XX:+Inline`
:   Enables method inlining. This option is enabled by default to increase
    performance. To disable method inlining, specify `-XX:-Inline`.

`-XX:InlineSmallCode=`*size*
:   Sets the maximum code size (in bytes) for already compiled methods
    that may be inlined. This flag only applies to the C2 compiler.
    Append the letter `k` or `K` to indicate kilobytes,
    `m` or `M` to indicate megabytes, or `g` or `G` to indicate gigabytes.
    The default value depends on the platform and on whether tiered compilation
    is enabled. In the following example it is set to 1000 bytes:

    >   `-XX:InlineSmallCode=1000`

`-XX:+LogCompilation`
:   Enables logging of compilation activity to a file named `hotspot.log` in
    the current working directory. You can specify a different log file path
    and name using the `-XX:LogFile` option.

    By default, this option is disabled and compilation activity isn't logged.
    The `-XX:+LogCompilation` option has to be used together with the
    `-XX:UnlockDiagnosticVMOptions` option that unlocks diagnostic JVM options.

    You can enable verbose diagnostic output with a message printed to the
    console every time a method is compiled by using the
    `-XX:+PrintCompilation` option.


`-XX:FreqInlineSize=`*size*
:   Sets the maximum bytecode size (in bytes) of a hot method to be inlined.
    This flag only applies to the C2 compiler. Append
    the letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate
    megabytes, or `g` or `G` to indicate gigabytes. The default value depends
    on the platform. In the following example it is set to 325 bytes:

    >   `-XX:FreqInlineSize=325`


`-XX:MaxInlineSize=`*size*
:   Sets the maximum bytecode size (in bytes) of a cold method to be inlined.
    This flag only applies to the C2 compiler.
    Append the letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate
    megabytes, or `g` or `G` to indicate gigabytes. By default, the maximum
    bytecode size is set to 35 bytes:

    >   `-XX:MaxInlineSize=35`

`-XX:C1MaxInlineSize=`*size*
:   Sets the maximum bytecode size (in bytes) of a cold method to be inlined.
    This flag only applies to the C1 compiler.
    Append the letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate
    megabytes, or `g` or `G` to indicate gigabytes. By default, the maximum
    bytecode size is set to 35 bytes:

    >   `-XX:MaxInlineSize=35`

`-XX:MaxTrivialSize=`*size*
:   Sets the maximum bytecode size (in bytes) of a trivial method to be
    inlined. This flag only applies to the C2 compiler.
    Append the letter `k` or `K` to indicate kilobytes, `m` or `M` to
    indicate megabytes, or `g` or `G` to indicate gigabytes. By default, the
    maximum bytecode size of a trivial method is set to 6 bytes:

    >   `-XX:MaxTrivialSize=6`

`-XX:C1MaxTrivialSize=`*size*
:   Sets the maximum bytecode size (in bytes) of a trivial method to be
    inlined. This flag only applies to the C1 compiler.
    Append the letter `k` or `K` to indicate kilobytes, `m` or `M` to
    indicate megabytes, or `g` or `G` to indicate gigabytes. By default, the
    maximum bytecode size of a trivial method is set to 6 bytes:

    >   `-XX:MaxTrivialSize=6`

`-XX:MaxNodeLimit=`*nodes*
:   Sets the maximum number of nodes to be used during single method
    compilation. By default the value depends on the features enabled.
    In the following example the maximum number of nodes is set to 100,000:

    >   `-XX:MaxNodeLimit=100000`

`-XX:NonNMethodCodeHeapSize=`*size*
:   Sets the size in bytes of the code segment containing nonmethod code.

    A nonmethod code segment containing nonmethod code, such as compiler
    buffers and the bytecode interpreter. This code type stays in the code
    cache forever. This flag is used only if `-XX:SegmentedCodeCache` is
    enabled.

`-XX:NonProfiledCodeHeapSize=`*size*
:   Sets the size in bytes of the code segment containing nonprofiled methods.
    This flag is used only if `-XX:SegmentedCodeCache` is enabled.

`-XX:+OptimizeStringConcat`
:   Enables the optimization of `String` concatenation operations. This option
    is enabled by default. To disable the optimization of `String`
    concatenation operations, specify `-XX:-OptimizeStringConcat`.

`-XX:+PrintAssembly`
:   Enables printing of assembly code for bytecoded and native methods by using
    the external `hsdis-<arch>.so` or `.dll` library. For 64-bit VM on Windows,
    it's `hsdis-amd64.dll`. This lets you to see the generated code, which may
    help you to diagnose performance issues.

    By default, this option is disabled and assembly code isn't printed. The
    `-XX:+PrintAssembly` option has to be used together with the
    `-XX:UnlockDiagnosticVMOptions` option that unlocks diagnostic JVM options.

`-XX:ProfiledCodeHeapSize=`*size*
:   Sets the size in bytes of the code segment containing profiled methods.
    This flag is used only if `-XX:SegmentedCodeCache` is enabled.

`-XX:+PrintCompilation`
:   Enables verbose diagnostic output from the JVM by printing a message to the
    console every time a method is compiled. This lets you to see which methods
    actually get compiled. By default, this option is disabled and diagnostic
    output isn't printed.

    You can also log compilation activity to a file by using the
    `-XX:+LogCompilation` option.

`-XX:+PrintInlining`
:   Enables printing of inlining decisions. This let's you see which methods
    are getting inlined.

    By default, this option is disabled and inlining information isn't printed.
    The `-XX:+PrintInlining` option has to be used together with the
    `-XX:+UnlockDiagnosticVMOptions` option that unlocks diagnostic JVM
    options.

`-XX:ReservedCodeCacheSize=`*size*
:   Sets the maximum code cache size (in bytes) for JIT-compiled code. Append
    the letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate
    megabytes, or `g` or `G` to indicate gigabytes. The default maximum code
    cache size is 240 MB; if you disable tiered compilation with the option
    `-XX:-TieredCompilation`, then the default size is 48 MB. This option has a
    limit of 2 GB; otherwise, an error is generated. The maximum code cache
    size shouldn't be less than the initial code cache size; see the option
    `-XX:InitialCodeCacheSize`.

`-XX:+SegmentedCodeCache`
:   Enables segmentation of the code cache, without which the code cache
    consists of one large segment. With `-XX:+SegmentedCodeCache`, separate
    segments will be used for non-method, profiled method, and non-profiled
    method code. The segments are not resized at runtime. The advantages are
    better control of the memory footprint, reduced code fragmentation, and
    better CPU iTLB (instruction translation lookaside buffer) and instruction
    cache behavior due to improved locality.

    The feature is enabled by default if tiered compilation is enabled
    (`-XX:+TieredCompilation` ) and the reserved code cache size
    (`-XX:ReservedCodeCacheSize`) is at least 240 MB.

`-XX:StartAggressiveSweepingAt=`*percent*
:   Forces stack scanning of active methods to aggressively remove unused code
    when only the given percentage of the code cache is free. The default value
    is 10%.

`-XX:-TieredCompilation`
:   Disables the use of tiered compilation. By default, this option is enabled.

`-XX:UseSSE=`*version*
:   Enables the use of SSE instruction set of a specified version.
    Is set by default to the highest supported version available (x86 only).

`-XX:UseAVX=`*version*
:   Enables the use of AVX instruction set of a specified version.
    Is set by default to the highest supported version available (x86 only).

`-XX:+UseAES`
:   Enables hardware-based AES intrinsics for hardware that supports it.
    This option is on by default on hardware that has the necessary instructions.
    The `-XX:+UseAES` is used in conjunction with `UseAESIntrinsics`. Flags
    that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseAESIntrinsics`
:   Enables AES intrinsics. Specifying `-XX:+UseAESIntrinsics` is equivalent to
    also enabling `-XX:+UseAES`. To disable hardware-based AES intrinsics,
    specify `-XX:-UseAES -XX:-UseAESIntrinsics`. For example, to enable hardware
    AES, use the following flags:

    >   `-XX:+UseAES -XX:+UseAESIntrinsics`

    Flags that control intrinsics now require the option
    `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseAESCTRIntrinsics`
:   Analogous to `-XX:+UseAESIntrinsics` enables AES/CTR intrinsics.

`-XX:+UseGHASHIntrinsics`
:   Controls the use of GHASH intrinsics. Enabled by default on platforms that
    support the corresponding instructions.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseChaCha20Intrinsics`
:   Enable ChaCha20 intrinsics. This option is on by default for supported
    platforms.  To disable ChaCha20 intrinsics, specify
    `-XX:-UseChaCha20Intrinsics`. Flags that control intrinsics now require
    the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UsePoly1305Intrinsics`
:   Enable Poly1305 intrinsics. This option is on by default for supported
    platforms.  To disable Poly1305 intrinsics, specify
    `-XX:-UsePoly1305Intrinsics`. Flags that control intrinsics now require
    the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseBASE64Intrinsics`
:   Controls the use of accelerated BASE64 encoding routines for `java.util.Base64`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseAdler32Intrinsics`
:   Controls the use of Adler32 checksum algorithm intrinsic for `java.util.zip.Adler32`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseCRC32Intrinsics`
:   Controls the use of CRC32 intrinsics for `java.util.zip.CRC32`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseCRC32CIntrinsics`
:   Controls the use of CRC32C intrinsics for `java.util.zip.CRC32C`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseSHA`
:   Enables hardware-based intrinsics for SHA crypto hash functions for some
    hardware. The `UseSHA` option is used in conjunction with the
    `UseSHA1Intrinsics`, `UseSHA256Intrinsics`, and `UseSHA512Intrinsics`
    options.

    The `UseSHA` and `UseSHA*Intrinsics` flags are enabled by default on
    machines that support the corresponding instructions.

    This feature is applicable only when using the `sun.security.provider.Sun`
    provider for SHA operations. Flags that control intrinsics now require the
    option `-XX:+UnlockDiagnosticVMOptions`.

    To disable all hardware-based SHA intrinsics, specify the `-XX:-UseSHA`. To
    disable only a particular SHA intrinsic, use the appropriate corresponding
    option. For example: `-XX:-UseSHA256Intrinsics`.

`-XX:+UseSHA1Intrinsics`
:   Enables intrinsics for SHA-1 crypto hash function. Flags that control
    intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseSHA256Intrinsics`
:   Enables intrinsics for SHA-224 and SHA-256 crypto hash functions. Flags
    that control intrinsics now require the option
    `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseSHA512Intrinsics`
:   Enables intrinsics for SHA-384 and SHA-512 crypto hash functions. Flags
    that control intrinsics now require the option
    `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseMathExactIntrinsics`
:   Enables intrinsification of various `java.lang.Math.*Exact()` functions.
    Enabled by default.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseMultiplyToLenIntrinsic`
:   Enables intrinsification of `BigInteger.multiplyToLen()`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

-XX:+UseSquareToLenIntrinsic
:   Enables intrinsification of `BigInteger.squareToLen()`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

-XX:+UseMulAddIntrinsic
:   Enables intrinsification of `BigInteger.mulAdd()`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

-XX:+UseMontgomeryMultiplyIntrinsic
:   Enables intrinsification of `BigInteger.montgomeryMultiply()`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

-XX:+UseMontgomerySquareIntrinsic
:   Enables intrinsification of `BigInteger.montgomerySquare()`.
    Enabled by default on platforms that support it.
    Flags that control intrinsics now require the option `-XX:+UnlockDiagnosticVMOptions`.

`-XX:+UseCMoveUnconditionally`
:   Generates CMove (scalar and vector) instructions regardless of
    profitability analysis.

`-XX:+UseCodeCacheFlushing`
:   Enables flushing of the code cache before shutting down the compiler. This
    option is enabled by default. To disable flushing of the code cache before
    shutting down the compiler, specify `-XX:-UseCodeCacheFlushing`.

`-XX:+UseCondCardMark`
:   Enables checking if the card is already marked before updating the card
    table. This option is disabled by default. It should be used only on
    machines with multiple sockets, where it increases the performance of Java
    applications that rely on concurrent operations.

`-XX:+UseCountedLoopSafepoints`
:   Keeps safepoints in counted loops. Its default value depends on whether the
    selected garbage collector requires low latency safepoints.

`-XX:LoopStripMiningIter=`*number_of_iterations*
:   Controls the number of iterations in the inner strip mined loop. Strip mining
    transforms counted loops into two level nested loops. Safepoints are kept
    in the outer loop while the inner loop can execute at full speed. This option
    controls the maximum number of iterations in the inner loop. The default value
    is 1,000.

`-XX:LoopStripMiningIterShortLoop=`*number_of_iterations*
:   Controls loop strip mining optimization. Loops with the number of iterations
    less than specified will not have safepoints in them. Default value is
    1/10th of `-XX:LoopStripMiningIter`.

`-XX:+UseFMA`
:   Enables hardware-based FMA intrinsics for hardware where FMA instructions
    are available (such as, Intel and ARM64). FMA intrinsics are
    generated for the `java.lang.Math.fma(`*a*`,` *b*`,` *c*`)` methods that
    calculate the value of `(` *a* `*` *b* `+` *c* `)` expressions.

`-XX:+UseSuperWord`
:   Enables the transformation of scalar operations into superword operations.
    Superword is a vectorization optimization. This option is enabled by
    default. To disable the transformation of scalar operations into superword
    operations, specify `-XX:-UseSuperWord`.

## Advanced Serviceability Options for Java

These `java` options provide the ability to gather system information and
perform extensive debugging.

`-XX:+DisableAttachMechanism`
:   Disables the mechanism that lets tools attach to the JVM. By default, this
    option is disabled, meaning that the attach mechanism is enabled and you
    can use diagnostics and troubleshooting tools such as `jcmd`, `jstack`,
    `jmap`, and `jinfo`.

    > **Note:** The tools such as [jcmd](jcmd.html), [jinfo](jinfo.html),
    [jmap](jmap.html), and [jstack](jstack.html) shipped with the JDK aren't
    supported when using the tools from one JDK version to troubleshoot a
    different JDK version.

`-XX:+DTraceAllocProbes`
:   **Linux and macOS:** Enable `dtrace` tool probes for object allocation.

`-XX:+DTraceMethodProbes`
:   **Linux and macOS:** Enable `dtrace` tool probes for method-entry
    and method-exit.

`-XX:+DTraceMonitorProbes`
:   **Linux and macOS:** Enable `dtrace` tool probes for monitor events.

`-XX:+HeapDumpOnOutOfMemoryError`
:   Enables the dumping of the Java heap to a file in the current directory by
    using the heap profiler (HPROF) when a `java.lang.OutOfMemoryError`
    exception is thrown by the JVM. You can explicitly set the heap dump file path and
    name using the `-XX:HeapDumpPath` option. By default, this option is
    disabled and the heap isn't dumped when an `OutOfMemoryError` exception is
    thrown.
    This applies only to `OutOfMemoryError` exceptions caused by Java Heap
    exhaustion; it does not apply to `OutOfMemoryError` exceptions thrown
    directly from Java code, nor by the JVM for other types of resource
    exhaustion (such as native thread creation errors).

`-XX:HeapDumpPath=`*path*
:   Sets the path and file name for writing the heap dump provided by the heap
    profiler (HPROF) when the `-XX:+HeapDumpOnOutOfMemoryError` option is set.
    By default, the file is created in the current working directory, and it's
    named `java_pid<pid>.hprof` where `<pid>` is the identifier of the process
    that caused the error. The following example shows how to set the default
    file explicitly (`%p` represents the current process identifier):

    >   `-XX:HeapDumpPath=./java_pid%p.hprof`

    -   **Non-Windows:** The following example shows how to
        set the heap dump file to `/var/log/java/java_heapdump.hprof`:

        >   `-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof`

    -   **Windows:** The following example shows how to set the heap dump file
        to `C:/log/java/java_heapdump.log`:

        >   `-XX:HeapDumpPath=C:/log/java/java_heapdump.log`

`-XX:LogFile=`*path*
:   Sets the path and file name to where log data is written. By default, the
    file is created in the current working directory, and it's named
    `hotspot.log`.

    -   **Non-Windows:** The following example shows how to
        set the log file to `/var/log/java/hotspot.log`:

        >   `-XX:LogFile=/var/log/java/hotspot.log`

    -   **Windows:** The following example shows how to set the log file to
        `C:/log/java/hotspot.log`:

        >   `-XX:LogFile=C:/log/java/hotspot.log`

`-XX:+PrintClassHistogram`
:   Enables printing of a class instance histogram after one of the following
    events:

    -   **Non-Windows:** `Control+\` (`SIGQUIT`)

    -   **Windows:** `Control+C` (`SIGTERM`)

    By default, this option is disabled.

    Setting this option is equivalent to running the `jmap -histo` command, or
    the `jcmd` *pid* `GC.class_histogram` command, where *pid* is the current
    Java process identifier.

`-XX:+PrintConcurrentLocks`
:   Enables printing of `java.util.concurrent` locks after one of the following
    events:

    -   **Non-Windows:** `Control+\` (`SIGQUIT`)

    -   **Windows:** `Control+C` (`SIGTERM`)

    By default, this option is disabled.

    Setting this option is equivalent to running the `jstack -l` command or the
    `jcmd` *pid* `Thread.print -l` command, where *pid* is the current Java
    process identifier.

`-XX:+PrintFlagsRanges`
:   Prints the range specified and allows automatic testing of the values. See
    [Validate Java Virtual Machine Flag
    Arguments].

`-XX:+PerfDataSaveToFile`
:   If enabled, saves [jstat](jstat.html) binary data when the Java application
    exits. This binary data is saved in a file named `hsperfdata_`*pid*, where
    *pid* is the process identifier of the Java application that you ran. Use
    the `jstat` command to display the performance data contained in this file
    as follows:

    >   `jstat -class file:///`*path*`/hsperfdata_`*pid*

    >   `jstat -gc file:///`*path*`/hsperfdata_`*pid*

`-XX:+UsePerfData`
:   Enables the `perfdata` feature. This option is enabled by default to allow
    JVM monitoring and performance testing. Disabling it suppresses the
    creation of the `hsperfdata_userid` directories. To disable the `perfdata`
    feature, specify `-XX:-UsePerfData`.

## Advanced Garbage Collection Options for Java

These `java` options control how garbage collection (GC) is performed by the
Java HotSpot VM.

`-XX:+AggressiveHeap`
:   Enables Java heap optimization. This sets various parameters to be
    optimal for long-running jobs with intensive memory allocation, based on
    the configuration of the computer (RAM and CPU). By default, the option
    is disabled and the heap sizes are configured less aggressively.

`-XX:+AlwaysPreTouch`
:   Requests the VM to touch every page on the Java heap after requesting it from
    the operating system and before handing memory out to the application.
    By default, this option is disabled and all pages are committed as the
    application uses the heap space.

`-XX:ConcGCThreads=`*threads*
:   Sets the number of threads used for concurrent GC. Sets *`threads`* to
    approximately 1/4 of the number of parallel garbage collection threads. The
    default value depends on the number of CPUs available to the JVM.

    For example, to set the number of threads for concurrent GC to 2, specify
    the following option:

    >   `-XX:ConcGCThreads=2`

`-XX:+DisableExplicitGC`
:   Enables the option that disables processing of calls to the `System.gc()`
    method. This option is disabled by default, meaning that calls to
    `System.gc()` are processed. If processing of calls to `System.gc()` is
    disabled, then the JVM still performs GC when necessary.

`-XX:+ExplicitGCInvokesConcurrent`
:   Enables invoking of concurrent GC by using the `System.gc()` request. This
    option is disabled by default and can be enabled only with the `-XX:+UseG1GC` option.

`-XX:G1AdaptiveIHOPNumInitialSamples=`*number*
:   When `-XX:UseAdaptiveIHOP` is enabled, this option sets the number of
    completed marking cycles used to gather samples until G1 adaptively
    determines the optimum value of `-XX:InitiatingHeapOccupancyPercent`. Before,
    G1 uses the value of `-XX:InitiatingHeapOccupancyPercent` directly for
    this purpose. The default value is 3.

`-XX:G1HeapRegionSize=`*size*
:   Sets the size of the regions into which the Java heap is subdivided when
    using the garbage-first (G1) collector. The value is a power of 2 and can
    range from 1 MB to 32 MB. The default region size is determined
    ergonomically based on the heap size with a goal of approximately 2048
    regions.

    The following example sets the size of the subdivisions to 16 MB:

    >   `-XX:G1HeapRegionSize=16m`

`-XX:G1HeapWastePercent=`*percent*
:   Sets the percentage of heap that you're willing to waste. The Java HotSpot
    VM doesn't initiate the mixed garbage collection cycle when the reclaimable
    percentage is less than the heap waste percentage. The default is 5
    percent.

`-XX:G1MaxNewSizePercent=`*percent*
:   Sets the percentage of the heap size to use as the maximum for the young
    generation size. The default value is 60 percent of your Java heap.

    This is an experimental flag. This setting replaces the
    `-XX:DefaultMaxNewGenPercent` setting.

`-XX:G1MixedGCCountTarget=`*number*
:   Sets the target number of mixed garbage collections after a marking cycle
    to collect old regions with at most `G1MixedGCLIveThresholdPercent` live
    data. The default is 8 mixed garbage collections. The goal for mixed
    collections is to be within this target number.

`-XX:G1MixedGCLiveThresholdPercent=`*percent*
:   Sets the occupancy threshold for an old region to be included in a mixed
    garbage collection cycle. The default occupancy is 85 percent.

    This is an experimental flag. This setting replaces the
    `-XX:G1OldCSetRegionLiveThresholdPercent` setting.

`-XX:G1NewSizePercent=`*percent*
:   Sets the percentage of the heap to use as the minimum for the young
    generation size. The default value is 5 percent of your Java heap.

    This is an experimental flag. This setting replaces the
    `-XX:DefaultMinNewGenPercent` setting.

`-XX:G1OldCSetRegionThresholdPercent=`*percent*
:   Sets an upper limit on the number of old regions to be collected during a
    mixed garbage collection cycle. The default is 10 percent of the Java heap.

`-XX:G1ReservePercent=`*percent*
:   Sets the percentage of the heap (0 to 50) that's reserved as a false
    ceiling to reduce the possibility of promotion failure for the G1
    collector. When you increase or decrease the percentage, ensure that you
    adjust the total Java heap by the same amount. By default, this option is
    set to 10%.

    The following example sets the reserved heap to 20%:

    >   `-XX:G1ReservePercent=20`

`-XX:+G1UseAdaptiveIHOP`
:   Controls adaptive calculation of the old generation occupancy to start
    background work preparing for an old generation collection. If enabled,
    G1 uses `-XX:InitiatingHeapOccupancyPercent` for the first few times as
    specified by the value of `-XX:G1AdaptiveIHOPNumInitialSamples`, and after
    that adaptively calculates a new optimum value for the initiating
    occupancy automatically.
    Otherwise, the old generation collection process always starts at the
    old generation occupancy determined by
    `-XX:InitiatingHeapOccupancyPercent`.

    The default is enabled.

`-XX:InitialHeapSize=`*size*
:   Sets the initial size (in bytes) of the memory allocation pool. This value
    must be either 0, or a multiple of 1024 and greater than 1 MB. Append the
    letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate megabytes,
    or `g` or `G` to indicate gigabytes. The default value is selected at run
    time based on the system configuration.

    The following examples show how to set the size of allocated memory to 6 MB
    using various units:

    ```
    -XX:InitialHeapSize=6291456
    -XX:InitialHeapSize=6144k
    -XX:InitialHeapSize=6m
    ```

    If you set this option to 0, then the initial size is set as the sum of the
    sizes allocated for the old generation and the young generation. The size
    of the heap for the young generation can be set using the `-XX:NewSize`
    option. Note that the `-Xms` option sets both the minimum and the initial
    heap size of the heap. If `-Xms` appears after `-XX:InitialHeapSize` on the
    command line, then the initial heap size gets set to the value specified
    with `-Xms`.

`-XX:InitialRAMPercentage=`*percent*
:   Sets the initial amount of memory that the JVM will use for the Java heap
    before applying ergonomics heuristics as a percentage of the maximum amount
    determined as described in the `-XX:MaxRAM` option. The default value is
    1.5625 percent.

    The following example shows how to set the percentage of the initial
    amount of memory used for the Java heap:

    >   `-XX:InitialRAMPercentage=5`

`-XX:InitialSurvivorRatio=`*ratio*
:   Sets the initial survivor space ratio used by the throughput garbage
    collector (which is enabled by the `-XX:+UseParallelGC` option). Adaptive
    sizing is enabled by default with the throughput garbage collector by
    using the `-XX:+UseParallelGC` option, and the survivor space is resized
    according to the application behavior, starting with the initial value. If
    adaptive sizing is disabled (using the `-XX:-UseAdaptiveSizePolicy`
    option), then the `-XX:SurvivorRatio` option should be used to set the size
    of the survivor space for the entire execution of the application.

    The following formula can be used to calculate the initial size of survivor
    space (S) based on the size of the young generation (Y), and the initial
    survivor space ratio (R):

    >   `S=Y/(R+2)`

    The 2 in the equation denotes two survivor spaces. The larger the value
    specified as the initial survivor space ratio, the smaller the initial
    survivor space size.

    By default, the initial survivor space ratio is set to 8. If the default
    value for the young generation space size is used (2 MB), then the initial
    size of the survivor space is 0.2 MB.

    The following example shows how to set the initial survivor space ratio to
    4:

    >   `-XX:InitialSurvivorRatio=4`

`-XX:InitiatingHeapOccupancyPercent=`*percent*
:   Sets the percentage of the old generation occupancy (0 to 100) at which to
    start the first few concurrent marking cycles for the G1 garbage collector.

    By default, the initiating value is set to 45%. A value of 0 implies
    nonstop concurrent GC cycles from the beginning until G1 adaptively sets this
    value.

    See also the `-XX:G1UseAdaptiveIHOP` and `-XX:G1AdaptiveIHOPNumInitialSamples`
    options.

    The following example shows how to set the initiating heap occupancy to 75%:

    >   `-XX:InitiatingHeapOccupancyPercent=75`

`-XX:MaxGCPauseMillis=`*time*
:   Sets a target for the maximum GC pause time (in milliseconds). This is a
    soft goal, and the JVM will make its best effort to achieve it. The
    specified value doesn't adapt to your heap size. By default, for G1 the
    maximum pause time target is 200 milliseconds. The other generational
    collectors do not use a pause time goal by default.

    The following example shows how to set the maximum target pause time to 500
    ms:

    >   `-XX:MaxGCPauseMillis=500`

`-XX:MaxHeapSize=`*size*
:   Sets the maximum size (in byes) of the memory allocation pool. This value
    must be a multiple of 1024 and greater than 2 MB. Append the letter `k` or
    `K` to indicate kilobytes, `m` or `M` to indicate megabytes, or `g` or `G`
    to indicate gigabytes. The default value is selected at run time based on
    the system configuration. For server deployments, the options
    `-XX:InitialHeapSize` and `-XX:MaxHeapSize` are often set to the same
    value.

    The following examples show how to set the maximum allowed size of
    allocated memory to 80 MB using various units:

    ```
    -XX:MaxHeapSize=83886080
    -XX:MaxHeapSize=81920k
    -XX:MaxHeapSize=80m
    ```

    The `-XX:MaxHeapSize` option is equivalent to `-Xmx`.

`-XX:MaxHeapFreeRatio=`*percent*
:   Sets the maximum allowed percentage of free heap space (0 to 100) after a
    GC event. If free heap space expands above this value, then the heap is
    shrunk. By default, this value is set to 70%.

    Minimize the Java heap size by lowering the values of the parameters
    `MaxHeapFreeRatio` (default value is 70%) and `MinHeapFreeRatio` (default
    value is 40%) with the command-line options `-XX:MaxHeapFreeRatio` and
    `-XX:MinHeapFreeRatio`. Lowering `MaxHeapFreeRatio` to as low as 10% and
    `MinHeapFreeRatio` to 5% has successfully reduced the heap size without too
    much performance regression; however, results may vary greatly depending on
    your application. Try different values for these parameters until they're
    as low as possible yet still retain acceptable performance.

    >   `-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5`

    Customers trying to keep the heap small should also add the option
    `-XX:-ShrinkHeapInSteps`. See [Performance Tuning Examples] for a
    description of using this option to keep the Java heap small by reducing
    the dynamic footprint for embedded applications.

`-XX:MaxMetaspaceSize=`*size*
:   Sets the maximum amount of native memory that can be allocated for class
    metadata. By default, the size isn't limited. The amount of metadata for an
    application depends on the application itself, other running applications,
    and the amount of memory available on the system.

    The following example shows how to set the maximum class metadata size to
    256 MB:

    >   `-XX:MaxMetaspaceSize=256m`

`-XX:MaxNewSize=`*size*
:   Sets the maximum size (in bytes) of the heap for the young generation
    (nursery). The default value is set ergonomically.

`-XX:MaxRAM=`*size*
:   Sets the maximum amount of memory that the JVM may use for the Java heap
    before applying ergonomics heuristics. The default value is the maximum
    amount of available memory to the JVM process or 128 GB, whichever is lower.

    The maximum amount of available memory to the JVM process is the minimum
    of the machine's physical memory and any constraints set by the environment
    (e.g. container).

    Specifying this option disables automatic use of compressed oops if
    the combined result of this and other options influencing the maximum amount
    of memory is larger than the range of memory addressable by compressed oops.
    See `-XX:UseCompressedOops` for further information about compressed oops.

    The following example shows how to set the maximum amount of available
    memory for sizing the Java heap to 2 GB:

    >   `-XX:MaxRAM=2G`

`-XX:MaxRAMPercentage=`*percent*
:   Sets the maximum amount of memory that the JVM may use for the Java heap
    before applying ergonomics heuristics as a percentage of the maximum amount
    determined as described in the `-XX:MaxRAM` option. The default value is 25
    percent.

    Specifying this option disables automatic use of compressed oops if
    the combined result of this and other options influencing the maximum amount
    of memory is larger than the range of memory addressable by compressed oops.
    See `-XX:UseCompressedOops` for further information about compressed oops.

    The following example shows how to set the percentage of the maximum amount
    of memory used for the Java heap:

    >   `-XX:MaxRAMPercentage=75`

`-XX:MinRAMPercentage=`*percent*
:   Sets the maximum amount of memory that the JVM may use for the Java heap
    before applying ergonomics heuristics as a percentage of the maximum amount
    determined as described in the `-XX:MaxRAM` option for small heaps. A small
    heap is a heap of approximately 125 MB. The default value is 50 percent.

    The following example shows how to set the percentage of the maximum amount
    of memory used for the Java heap for small heaps:

    >   `-XX:MinRAMPercentage=75`

`-XX:MaxTenuringThreshold=`*threshold*
:   Sets the maximum tenuring threshold for use in adaptive GC sizing. The
    largest value is 15. The default value is 15 for the parallel (throughput)
    collector.

    The following example shows how to set the maximum tenuring threshold to
    10:

    >   `-XX:MaxTenuringThreshold=10`

`-XX:MetaspaceSize=`*size*
:   Sets the size of the allocated class metadata space that triggers a garbage
    collection the first time it's exceeded. This threshold for a garbage
    collection is increased or decreased depending on the amount of metadata
    used. The default size depends on the platform.

`-XX:MinHeapFreeRatio=`*percent*
:   Sets the minimum allowed percentage of free heap space (0 to 100) after a
    GC event. If free heap space falls below this value, then the heap is
    expanded. By default, this value is set to 40%.

    Minimize Java heap size by lowering the values of the parameters
    `MaxHeapFreeRatio` (default value is 70%) and `MinHeapFreeRatio` (default
    value is 40%) with the command-line options `-XX:MaxHeapFreeRatio` and
    `-XX:MinHeapFreeRatio`. Lowering `MaxHeapFreeRatio` to as low as 10% and
    `MinHeapFreeRatio` to 5% has successfully reduced the heap size without too
    much performance regression; however, results may vary greatly depending on
    your application. Try different values for these parameters until they're
    as low as possible, yet still retain acceptable performance.

    >   `-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5`

    Customers trying to keep the heap small should also add the option
    `-XX:-ShrinkHeapInSteps`. See [Performance Tuning Examples] for a
    description of using this option to keep the Java heap small by reducing
    the dynamic footprint for embedded applications.

`-XX:MinHeapSize=`*size*
:   Sets the minimum size (in bytes) of the memory allocation pool. This value
    must be either 0, or a multiple of 1024 and greater than 1 MB. Append the
    letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate megabytes,
    or `g` or `G` to indicate gigabytes. The default value is selected at run
    time based on the system configuration.

    The following examples show how to set the minimum size of allocated memory
    to 6 MB using various units:

    ```
    -XX:MinHeapSize=6291456
    -XX:MinHeapSize=6144k
    -XX:MinHeapSize=6m
    ```

    If you set this option to 0, then the minimum size is set to the same value
    as the initial size.

`-XX:NewRatio=`*ratio*
:   Sets the ratio between young and old generation sizes. By default, this
    option is set to 2. The following example shows how to set the young-to-old
    ratio to 1:

    >   `-XX:NewRatio=1`

`-XX:NewSize=`*size*
:   Sets the initial size (in bytes) of the heap for the young generation
    (nursery). Append the letter `k` or `K` to indicate kilobytes, `m` or `M`
    to indicate megabytes, or `g` or `G` to indicate gigabytes.

    The young generation region of the heap is used for new objects. GC is
    performed in this region more often than in other regions. If the size for
    the young generation is too low, then a large number of minor GCs are
    performed. If the size is too high, then only full GCs are performed, which
    can take a long time to complete. It is recommended that you keep the size
    for the young generation greater than 25% and less than 50% of the overall
    heap size.

    The following examples show how to set the initial size of the young
    generation to 256 MB using various units:

    ```
    -XX:NewSize=256m
    -XX:NewSize=262144k
    -XX:NewSize=268435456
    ```

    The `-XX:NewSize` option is equivalent to `-Xmn`.

`-XX:ParallelGCThreads=`*threads*
:   Sets the number of the stop-the-world (STW) worker threads. The default value
    depends on the number of CPUs available to the JVM and the garbage collector
    selected.

    For example, to set the number of threads for G1 GC to 2, specify the
    following option:

    >   `-XX:ParallelGCThreads=2`

`-XX:+ParallelRefProcEnabled`
:   Enables parallel reference processing. By default, collectors employing multiple
    threads perform parallel reference processing if the number of parallel threads
    to use is larger than one.
    The option is available only when the throughput or G1 garbage collector is used
    (`-XX:+UseParallelGC` or `-XX:+UseG1GC`). Other collectors employing multiple
    threads always perform reference processing in parallel.

`-XX:+PrintAdaptiveSizePolicy`
:   Enables printing of information about adaptive-generation sizing. By
    default, this option is disabled.

`-XX:SoftRefLRUPolicyMSPerMB=`*time*
:   Sets the amount of time (in milliseconds) a softly reachable object is
    kept active on the heap after the last time it was referenced. The default
    value is one second of lifetime per free megabyte in the heap. The
    `-XX:SoftRefLRUPolicyMSPerMB` option accepts integer values representing
    milliseconds per one megabyte of the current heap size (for Java HotSpot
    Client VM) or the maximum possible heap size (for Java HotSpot Server VM).
    This difference means that the Client VM tends to flush soft references
    rather than grow the heap, whereas the Server VM tends to grow the heap
    rather than flush soft references. In the latter case, the value of the
    `-Xmx` option has a significant effect on how quickly soft references are
    garbage collected.

    The following example shows how to set the value to 2.5 seconds:

    `-XX:SoftRefLRUPolicyMSPerMB=2500`

`-XX:-ShrinkHeapInSteps`
:   Incrementally reduces the Java heap to the target size, specified by the
    option `-XX:MaxHeapFreeRatio`. This option is enabled by default. If
    disabled, then it immediately reduces the Java heap to the target size
    instead of requiring multiple garbage collection cycles. Disable this
    option if you want to minimize the Java heap size. You will likely
    encounter performance degradation when this option is disabled.

    See [Performance Tuning Examples] for a description of using the
    `MaxHeapFreeRatio` option to keep the Java heap small by reducing the
    dynamic footprint for embedded applications.

`-XX:StringDeduplicationAgeThreshold=`*threshold*
:   Identifies `String` objects reaching the specified age that are considered
    candidates for deduplication. An object's age is a measure of how many
    times it has survived garbage collection. This is sometimes referred to as
    tenuring.

    > **Note:** `String` objects that are promoted to an old heap region before this age
    has been reached are always considered candidates for deduplication. The
    default value for this option is `3`. See the `-XX:+UseStringDeduplication`
    option.

`-XX:SurvivorRatio=`*ratio*
:   Sets the ratio between eden space size and survivor space size. By default,
    this option is set to 8. The following example shows how to set the
    eden/survivor space ratio to 4:

    >   `-XX:SurvivorRatio=4`

`-XX:TargetSurvivorRatio=`*percent*
:   Sets the desired percentage of survivor space (0 to 100) used after young
    garbage collection. By default, this option is set to 50%.

    The following example shows how to set the target survivor space ratio to
    30%:

    >   `-XX:TargetSurvivorRatio=30`

`-XX:TLABSize=`*size*
:   Sets the initial size (in bytes) of a thread-local allocation buffer
    (TLAB). Append the letter `k` or `K` to indicate kilobytes, `m` or `M` to
    indicate megabytes, or `g` or `G` to indicate gigabytes. If this option is
    set to 0, then the JVM selects the initial size automatically.

    The following example shows how to set the initial TLAB size to 512 KB:

    >   `-XX:TLABSize=512k`

`-XX:+UseAdaptiveSizePolicy`
:   Enables the use of adaptive generation sizing. This option is enabled by
    default. To disable adaptive generation sizing, specify
    `-XX:-UseAdaptiveSizePolicy` and set the size of the memory allocation pool
    explicitly. See the `-XX:SurvivorRatio` option.

`-XX:+UseG1GC`
:   Enables the use of the garbage-first (G1) garbage collector. It's a
    server-style garbage collector, targeted for multiprocessor machines with a
    large amount of RAM. This option meets GC pause time goals with high
    probability, while maintaining good throughput. The G1 collector is
    recommended for applications requiring large heaps (sizes of around 6 GB or
    larger) with limited GC latency requirements (a stable and predictable
    pause time below 0.5 seconds). By default, this option is enabled and G1 is
    used as the default garbage collector.

`-XX:+UseGCOverheadLimit`
:   Enables the use of a policy that limits the proportion of time spent by the
    JVM on GC before an `OutOfMemoryError` exception is thrown. This option is
    enabled, by default, and the parallel GC will throw an `OutOfMemoryError`
    if more than 98% of the total time is spent on garbage collection and less
    than 2% of the heap is recovered. When the heap is small, this feature can
    be used to prevent applications from running for long periods of time with
    little or no progress. To disable this option, specify the option
    `-XX:-UseGCOverheadLimit`.

`-XX:+UseNUMA`
:   Enables performance optimization of an application on a machine with
    nonuniform memory architecture (NUMA) by increasing the application's use
    of lower latency memory. The default value for this option depends on the
    garbage collector.

`-XX:+UseParallelGC`
:   Enables the use of the parallel scavenge garbage collector (also known as
    the throughput collector) to improve the performance of your application by
    leveraging multiple processors.

    By default, this option is disabled and the default collector is used.

`-XX:+UseSerialGC`
:   Enables the use of the serial garbage collector. This is generally the best
    choice for small and simple applications that don't require any special
    functionality from garbage collection. By default, this option is disabled
    and the default collector is used.

`-XX:+UseStringDeduplication`
:   Enables string deduplication. By default, this option is disabled. To use
    this option, you must enable the garbage-first (G1) garbage collector.

    String deduplication reduces the memory footprint of `String` objects on
    the Java heap by taking advantage of the fact that many `String` objects
    are identical. Instead of each `String` object pointing to its own
    character array, identical `String` objects can point to and share the same
    character array.

`-XX:+UseTLAB`
:   Enables the use of thread-local allocation blocks (TLABs) in the young
    generation space. This option is enabled by default. To disable the use of
    TLABs, specify the option `-XX:-UseTLAB`.

`-XX:+UseZGC`
:   Enables the use of the Z garbage collector (ZGC). This is a low latency
    garbage collector, providing max pause times of a few milliseconds, at
    some throughput cost. Pause times are independent of what heap size is
    used. Supports heap sizes from 8MB to 16TB.

`-XX:ZAllocationSpikeTolerance=`*factor*
:   Sets the allocation spike tolerance for ZGC. By default, this option is
    set to 2.0. This factor describes the level of allocation spikes to expect.
    For example, using a factor of 3.0 means the current allocation rate can
    be expected to triple at any time.

`-XX:ZCollectionInterval=`*seconds*
:   Sets the maximum interval (in seconds) between two GC cycles when using
    ZGC. By default, this option is set to 0 (disabled).

`-XX:ZFragmentationLimit=`*percent*
:   Sets the maximum acceptable heap fragmentation (in percent) for ZGC.
    By default, this option is set to 25. Using a lower value will cause the
    heap to be compacted more aggressively, to reclaim more memory at the cost
    of using more CPU time.

`-XX:+ZProactive`
:   Enables proactive GC cycles when using ZGC. By default, this option is
    enabled. ZGC will start a proactive GC cycle if doing so is expected to
    have minimal impact on the running application. This is useful if the
    application is mostly idle or allocates very few objects, but you still
    want to keep the heap size down and allow reference processing to happen
    even when there are a lot of free space on the heap.

`-XX:+ZUncommit`
:   Enables uncommitting of unused heap memory when using ZGC. By default,
    this option is enabled. Uncommitting unused heap memory will lower the
    memory footprint of the JVM, and make that memory available for other
    processes to use.

`-XX:ZUncommitDelay=`*seconds*
:   Sets the amount of time (in seconds) that heap memory must have been
    unused before being uncommitted. By default, this option is set to 300
    (5 minutes). Committing and uncommitting memory are relatively
    expensive operations. Using a lower value will cause heap memory to be
    uncommitted earlier, at the risk of soon having to commit it again.

## Deprecated Java Options

These `java` options are deprecated and might be removed in a future JDK
release. They're still accepted and acted upon, but a warning is issued when
they're used.

`-Xloggc:`*filename*
:   Sets the file to which verbose GC events information should be redirected
    for logging. The `-Xloggc` option overrides `-verbose:gc` if both are given
    with the same java command. `-Xloggc:`*filename* is replaced by
    `-Xlog:gc:`*filename*. See Enable Logging with the JVM Unified Logging
    Framework.

    Example:

    `-Xlog:gc:garbage-collection.log`

`-XX:+FlightRecorder`
:   Enables the use of Java Flight Recorder (JFR) during the runtime of the
    application. Since JDK 8u40 this option has not been required to use JFR.

## Obsolete Java Options

These `java` options are still accepted but ignored, and a warning is issued
when they're used.

`--illegal-access=`*parameter*
:   Controlled _relaxed strong encapsulation_, as defined in [JEP
    261](https://openjdk.org/jeps/261#Relaxed-strong-encapsulation).
    This option was deprecated in JDK 16 by [JEP
    396](https://openjdk.org/jeps/396) and made obsolete in JDK 17
    by [JEP 403](https://openjdk.org/jeps/403).

## Removed Java Options

These `java` options have been removed in JDK @@VERSION_SPECIFICATION@@ and using them results in an error of:

>   `Unrecognized VM option` *option-name*

`-XX:RTMAbortRatio=`*abort\_ratio*
:   Specifies the RTM abort ratio is specified as a percentage (%) of all
    executed RTM transactions. If a number of aborted transactions becomes
    greater than this ratio, then the compiled code is deoptimized. This ratio
    is used when the `-XX:+UseRTMDeopt` option is enabled. The default value of
    this option is 50. This means that the compiled code is deoptimized if 50%
    of all transactions are aborted.

`-XX:RTMRetryCount=`*number\_of\_retries*
:   Specifies the number of times that the RTM locking code is retried, when it
    is aborted or busy, before falling back to the normal locking mechanism.
    The default value for this option is 5. The `-XX:UseRTMLocking` option must
    be enabled.

`-XX:+UseRTMDeopt`
:   Autotunes RTM locking depending on the abort ratio. This ratio is specified
    by the `-XX:RTMAbortRatio` option. If the number of aborted transactions
    exceeds the abort ratio, then the method containing the lock is deoptimized
    and recompiled with all locks as normal locks. This option is disabled by
    default. The `-XX:+UseRTMLocking` option must be enabled.

`-XX:+UseRTMLocking`
:   Generates Restricted Transactional Memory (RTM) locking code for all
    inflated locks, with the normal locking mechanism as the fallback handler.
    This option is disabled by default. Options related to RTM are available
    only on x86 CPUs that support Transactional Synchronization Extensions (TSX).

    RTM is part of Intel's TSX, which is an x86 instruction set extension and
    facilitates the creation of multithreaded applications. RTM introduces the
    new instructions `XBEGIN`, `XABORT`, `XEND`, and `XTEST`. The `XBEGIN` and
    `XEND` instructions enclose a set of instructions to run as a transaction.
    If no conflict is found when running the transaction, then the memory and
    register modifications are committed together at the `XEND` instruction.
    The `XABORT` instruction can be used to explicitly abort a transaction and
    the `XTEST` instruction checks if a set of instructions is being run in a
    transaction.

    A lock on a transaction is inflated when another thread tries to access the
    same transaction, thereby blocking the thread that didn't originally
    request access to the transaction. RTM requires that a fallback set of
    operations be specified in case a transaction aborts or fails. An RTM lock
    is a lock that has been delegated to the TSX's system.

    RTM improves performance for highly contended locks with low conflict in a
    critical region (which is code that must not be accessed by more than one
    thread concurrently). RTM also improves the performance of coarse-grain
    locking, which typically doesn't perform well in multithreaded
    applications. (Coarse-grain locking is the strategy of holding locks for
    long periods to minimize the overhead of taking and releasing locks, while
    fine-grained locking is the strategy of trying to achieve maximum
    parallelism by locking only when necessary and unlocking as soon as
    possible.) Also, for lightly contended locks that are used by different
    threads, RTM can reduce false cache line sharing, also known as cache line
    ping-pong. This occurs when multiple threads from different processors are
    accessing different resources, but the resources share the same cache line.
    As a result, the processors repeatedly invalidate the cache lines of other
    processors, which forces them to read from main memory instead of their
    cache.

For the lists and descriptions of options removed in previous releases see the *Removed Java Options* section in:

-   [The `java` Command, Release 24](https://docs.oracle.com/en/java/javase/24/docs/specs/man/java.html)

-   [The `java` Command, Release 23](https://docs.oracle.com/en/java/javase/23/docs/specs/man/java.html)

-   [The `java` Command, Release 22](https://docs.oracle.com/en/java/javase/22/docs/specs/man/java.html)

-   [The `java` Command, Release 21](https://docs.oracle.com/en/java/javase/21/docs/specs/man/java.html)

-   [The `java` Command, Release 20](https://docs.oracle.com/en/java/javase/20/docs/specs/man/java.html)

-   [The `java` Command, Release 19](https://docs.oracle.com/en/java/javase/19/docs/specs/man/java.html)

-   [The `java` Command, Release 18](https://docs.oracle.com/en/java/javase/18/docs/specs/man/java.html)

-   [The `java` Command, Release 17](https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html)

-   [The `java` Command, Release 16](https://docs.oracle.com/en/java/javase/16/docs/specs/man/java.html)

-   [The `java` Command, Release 15](https://docs.oracle.com/en/java/javase/15/docs/specs/man/java.html)

-   [The `java` Command, Release 14](https://docs.oracle.com/en/java/javase/14/docs/specs/man/java.html)

-   [The `java` Command, Release 13](https://docs.oracle.com/en/java/javase/13/docs/specs/man/java.html)

-   [Java Platform, Standard Edition Tools Reference, Release 12](
    https://docs.oracle.com/en/java/javase/12/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE)

-   [Java Platform, Standard Edition Tools Reference, Release 11](
    https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-741FC470-AA3E-494A-8D2B-1B1FE4A990D1)

-   [Java Platform, Standard Edition Tools Reference, Release 10](
    https://docs.oracle.com/javase/10/tools/java.htm#JSWOR624)

-   [Java Platform, Standard Edition Tools Reference, Release 9](
    https://docs.oracle.com/javase/9/tools/java.htm#JSWOR624)

-   [Java Platform, Standard Edition Tools Reference, Release 8 for Oracle JDK
    on Windows](
    https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html#BGBCIEFC)

-   [Java Platform, Standard Edition Tools Reference, Release 8 for Oracle JDK
    on Solaris, Linux, and macOS](
    https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC)

## java Command-Line Argument Files

You can shorten or simplify the `java` command by using `@` argument files to
specify one or more text files that contain arguments, such as options and
class names, which are passed to the `java` command. This let's you to create
`java` commands of any length on any operating system.

In the command line, use the at sign (`@`) prefix to identify an argument file
that contains `java` options and class names. When the `java` command
encounters a file beginning with the at sign (`@`), it expands the contents of
that file into an argument list just as they would be specified on the command
line.

The `java` launcher expands the argument file contents until it encounters the
`--disable-@files` option. You can use the `--disable-@files` option anywhere
on the command line, including in an argument file, to stop `@` argument files
expansion.

The following items describe the syntax of `java` argument files:

-   The argument file must contain only ASCII characters or characters in
    system default encoding that's ASCII friendly, such as UTF-8.

-   The argument file size must not exceed MAXINT (2,147,483,647) bytes.

-   The launcher doesn't expand wildcards that are present within an argument
    file. That means an asterisk (`*`) is passed on as-is to the starting VM.
    For example `*.java` stays `*.java` and is not expanded to
    `Foo.java Bar.java ...`, as would happen with some command line shells.

-   Use white space or new line characters to separate arguments included in
    the file.

-   White space includes a white space character, `\t`, `\n`, `\r`, and `\f`.

    For example, it is possible to have a path with a space, such as
    `c:\Program Files` that can be specified as either `"c:\\Program Files"` or,
    to avoid an escape, `c:\Program" "Files`.

-   Any option that contains spaces, such as a path component, must be within
    quotation marks using quotation ('\"') characters in its entirety.

-   A string within quotation marks may contain the characters `\n`, `\r`,
    `\t`, and `\f`. They are converted to their respective ASCII codes.

-   If a file name contains embedded spaces, then put the whole file name in
    double quotation marks.

-   File names in an argument file are relative to the current directory, not
    to the location of the argument file.

-   Use the number sign `#` in the argument file to identify comments. All
    characters following the `#` are ignored until the end of line.

-   Additional at sign `@` prefixes to `@` prefixed options act as an escape,
    (the first `@` is removed and the rest of the arguments are presented to
    the launcher literally).

-   Lines may be continued using the continuation character (`\`) at the
    end-of-line. The two lines are concatenated with the leading white spaces
    trimmed. To prevent trimming the leading white spaces, a continuation
    character (`\`) may be placed at the first column.

-   Because backslash (\\) is an escape character, a backslash character must
    be escaped with another backslash character.

-   Partial quote is allowed and is closed by an end-of-file.

-   An open quote stops at end-of-line unless `\` is the last character, which
    then joins the next line by removing all leading white space characters.

-   Use of the at sign (`@`) to recursively interpret files isn't supported.

### Example of Open or Partial Quotes in an Argument File

In the argument file,

```
-cp "lib/
cool/
app/
jars
```

this is interpreted as:

>   `-cp lib/cool/app/jars`

### Example of a Backslash Character Escaped with Another Backslash Character in an Argument File

To output the following:

>   `-cp c:\Program Files (x86)\Java\jre\lib\ext;c:\Program
    Files\Java\jre9\lib\ext`

The backslash character must be specified in the argument file as:

>   `-cp "c:\\Program Files (x86)\\Java\\jre\\lib\\ext;c:\\Program
    Files\\Java\\jre9\\lib\\ext"`

### Example of an EOL Escape Used to Force Concatenation of Lines in an Argument File

In the argument file,

```
-cp "/lib/cool app/jars:\
    /lib/another app/jars"
```

This is interpreted as:

>   `-cp /lib/cool app/jars:/lib/another app/jars`

### Example of Line Continuation with Leading Spaces in an Argument File

In the argument file,

```
-cp "/lib/cool\
\app/jars"
```

This is interpreted as:

`-cp /lib/cool app/jars`

### Examples of Using Single Argument File

You can use a single argument file, such as `myargumentfile` in the following
example, to hold all required `java` arguments:

>   `java @myargumentfile`

### Examples of Using Argument Files with Paths

You can include relative paths in argument files; however, they're relative to
the current working directory and not to the paths of the argument files
themselves. In the following example, `path1/options` and `path2/options`
represent argument files with different paths. Any relative paths that they
contain are relative to the current working directory and not to the argument
files:

>   `java @path1/options @path2/classes`

## Code Heap State Analytics

### Overview

There are occasions when having insight into the current state of the JVM code
heap would be helpful to answer questions such as:

-   Why was the JIT turned off and then on again and again?

-   Where has all the code heap space gone?

-   Why is the method sweeper not working effectively?

To provide this insight, a code heap state analytics feature has been
implemented that enables on-the-fly analysis of the code heap. The analytics
process is divided into two parts. The first part examines the entire code heap
and aggregates all information that is believed to be useful or important. The
second part consists of several independent steps that print the collected
information with an emphasis on different aspects of the data. Data collection
and printing are done on an "on request" basis.

### Syntax

Requests for real-time, on-the-fly analysis can be issued with the following
command:

>   `jcmd` *pid* `Compiler.CodeHeap_Analytics` \[*function*\] \[*granularity*\]

If you are only interested in how the code heap looks like after running a
sample workload, you can use the command line option:

>   `-Xlog:codecache=Trace`

To see the code heap state when a "CodeCache full" condition exists, start the
VM with the command line option:

>   `-Xlog:codecache=Debug`

See [CodeHeap State Analytics (OpenJDK)](
https://bugs.openjdk.org/secure/attachment/75649/JVM_CodeHeap_StateAnalytics_V2.pdf)
for a detailed description of the code heap state analytics feature, the
supported functions, and the granularity options.

## Enable Logging with the JVM Unified Logging Framework

You use the `-Xlog` option to configure or enable logging with the Java Virtual
Machine (JVM) unified logging framework.

### Synopsis

>   `-Xlog`\[`:`\[*what*\]\[`:`\[*output*\]\[`:`\[*decorators*\]\[`:`*output-options*\[`,`...\]\]\]\]\]
>
>   `-Xlog:`*directive*

*what*
:   Specifies a combination of tags and levels of the form
    *tag1*\[`+`*tag2*...\]\[`*`\]\[`=`*level*\]\[`,`...\]. Unless the wildcard
    (`*`) is specified, only log messages tagged with exactly the tags
    specified are matched. See [-Xlog Tags and Levels].

*output*
:   Sets the type of output. Omitting the *output* type defaults to `stdout`.
    See [-Xlog Output].

*decorators*
:   Configures the output to use a custom set of decorators. Omitting
    *decorators* defaults to `uptime`, `level`, and `tags`. See
    [Decorations].

*output-options*
:   Sets the `-Xlog` logging output options.

*directive*
:   A global option or subcommand: help, disable, async

### Description

The Java Virtual Machine (JVM) unified logging framework provides a common
logging system for all components of the JVM. GC logging for the JVM has been
changed to use the new logging framework. The mapping of old GC flags to the
corresponding new Xlog configuration is described in [Convert GC Logging Flags
to Xlog]. In addition, runtime logging has also been changed to use the JVM
unified logging framework. The mapping of legacy runtime logging flags to the
corresponding new Xlog configuration is described in [Convert Runtime Logging
Flags to Xlog].

The following provides quick reference to the `-Xlog` command and syntax for
options:

`-Xlog`
:   Enables JVM logging on an `info` level.

`-Xlog:help`
:   Prints `-Xlog` usage syntax and available tags, levels, and decorators
    along with example command lines with explanations.

`-Xlog:disable`
:   Turns off all logging and clears all configuration of the logging framework
    including the default configuration for warnings and errors.

`-Xlog`\[`:`*option*\]
:   Applies multiple arguments in the order that they appear on the command
    line. Multiple `-Xlog` arguments for the same output override each other in
    their given order.

    The *option* is set as:

    >   \[*tag-selection*\]\[`:`\[*output*\]\[`:`\[*decorators*\]\[`:`*output-options*\]\]\]

    Omitting the *tag-selection* defaults to a tag-set of `all` and a level of
    `info`.

    >   *tag*\[`+`...\] `all`

    The `all` tag is a meta tag consisting of all tag-sets available. The
    asterisk `*` in a tag set definition denotes a wildcard tag match. Matching
    with a wildcard selects all tag sets that contain *at least* the specified
    tags. Without the wildcard, only exact matches of the specified tag sets
    are selected.

    *output-options* is

    >   `filecount=`*file-count* `filesize=`*file size with optional K, M or G
        suffix* `foldmultilines=`*<true|false>*

    When `foldmultilines` is true, a log event that consists of
    multiple lines will be folded into a single line by replacing newline characters
    with the sequence `'\'` and `'n'` in the output.
    Existing single backslash characters will also be replaced with a sequence of
    two backslashes so that the conversion can be reversed.
    This option is safe to use with UTF-8 character encodings, but other encodings may not work.
    For example, it may incorrectly convert multi-byte sequences in Shift JIS and BIG5.

### Default Configuration

When the `-Xlog` option and nothing else is specified on the command line, the
default configuration is used. The default configuration logs all messages with
a level that matches either warning or error regardless of what tags the
message is associated with. The default configuration is equivalent to entering
the following on the command line:

>   `-Xlog:all=warning:stdout:uptime,level,tags`

### Controlling Logging at Runtime

Logging can also be controlled at run time through Diagnostic Commands (with
the [jcmd](jcmd.html) utility). Everything that can be specified on the command line can
also be specified dynamically with the `VM.log` command. As the diagnostic
commands are automatically exposed as MBeans, you can use JMX to change logging
configuration at run time.

### -Xlog Tags and Levels

Each log message has a level and a tag set associated with it. The level of
the message corresponds to its details, and the tag set corresponds to what
the message contains or which JVM component it involves (such as, `gc`,
`jit`, or `os`). Mapping GC flags to the Xlog configuration is described
in [Convert GC Logging Flags to Xlog]. Mapping legacy runtime logging flags to
the corresponding Xlog configuration is described in [Convert Runtime Logging
Flags to Xlog].

**Available log levels:**

-   `off`
-   `trace`
-   `debug`
-   `info`
-   `warning`
-   `error`

**Available log tags:**

There are literally dozens of log tags, which in the right combinations, will enable
a range of logging output. The full set of available log tags can be seen using `-Xlog:help`.
Specifying `all` instead of a tag combination matches all tag combinations.

### -Xlog Output

The `-Xlog` option supports the following types of outputs:

-   `stdout` --- Sends output to stdout
-   `stderr` --- Sends output to stderr
-   `file=`*filename* --- Sends output to text file(s).

When using `file=`*filename*, specifying `%p`, `%t`  and/or `%hn` in the file name
expands to the JVM's PID, startup timestamp and host name, respectively. You can also
configure text files to handle file rotation based on file size and a number of
files to rotate. For example, to rotate the log file every 10 MB and keep 5
files in rotation, specify the options `filesize=10M, filecount=5`. The target
size of the files isn't guaranteed to be exact, it's just an approximate value.
Files are rotated by default with up to 5 rotated files of target size 20 MB,
unless configured otherwise. Specifying `filecount=0` means that the log file
shouldn't be rotated. There's a possibility of the pre-existing log file
getting overwritten.

### -Xlog Output Mode

By default logging messages are output synchronously - each log message is written to
the designated output when the logging call is made. You can instead use asynchronous
logging mode by specifying:

`-Xlog:async[:[stall|drop]]`
:     Write all logging asynchronously.

In asynchronous logging mode, log sites enqueue all logging messages to an intermediate buffer
and a standalone thread is responsible for flushing them to the corresponding outputs. The
intermediate buffer is bounded. On buffer exhaustion the enqueuing message is either discarded (`async:drop`),
or logging threads are stalled until the flushing thread catches up (`async:stall`).
If no specific mode is chosen, then `async:drop` is chosen by default.
Log entry write operations are guaranteed to be non-blocking in the `async:drop` case.

The option `-XX:AsyncLogBufferSize=N` specifies the memory budget in bytes for the intermediate buffer.
The default value should be big enough to cater for most cases. Users can provide a custom value to
trade memory overhead for log accuracy if they need to.

### Decorations

Logging messages are decorated with information about the message. You can
configure each output to use a custom set of decorators. The order of the
output is always the same as listed in the table. You can configure the
decorations to be used at run time. Decorations are prepended to the log
message. For example:

```
[6.567s][info][gc,old] Old collection complete
```

Omitting `decorators` defaults to `uptime`, `level`, and `tags`. The `none`
decorator is special and is used to turn off all decorations.

`time` (`t`), `utctime` (`utc`), `uptime` (`u`), `timemillis` (`tm`),
`uptimemillis` (`um`), `timenanos` (`tn`), `uptimenanos` (`un`), `hostname`
(`hn`), `pid` (`p`), `tid` (`ti`), `level` (`l`), `tags` (`tg`) decorators can
also be specified as `none` for no decoration.

Table: Logging Messages Decorations

---------------  --------------------------------------------------------------
Decorations      Description
---------------  --------------------------------------------------------------
`time` or `t`    Current time and date in ISO-8601 format.

`utctime`        Universal Time Coordinated or Coordinated Universal Time.
or `utc`

`uptime` or `u`  Time since the start of the JVM in seconds and milliseconds.
                 For example, 6.567s.

`timemillis`     The same value as generated by `System.currentTimeMillis()`
or `tm`

`uptimemillis`   Milliseconds since the JVM started.
or `um`

`timenanos`      The same value generated by `System.nanoTime()`.
or `tn`

`uptimenanos`    Nanoseconds since the JVM started.
or `un`

`hostname`       The host name.
or `hn`

`pid` or `p`     The process identifier.

`tid` or `ti`    The thread identifier.

`level` or `l`   The level associated with the log message.

`tags` or `tg`   The tag-set associated with the log message.
---------------  --------------------------------------------------------------

### Convert GC Logging Flags to Xlog

Table: Legacy GC Logging Flags to Xlog Configuration Mapping

------------------------------------  --------------------------  ----------------------------------------------------
Legacy Garbage Collection (GC) Flag   Xlog Configuration          Comment
------------------------------------  --------------------------  ----------------------------------------------------
`G1PrintHeapRegions`                  `-Xlog:gc+region=trace`     Not Applicable

`GCLogFileSize`                       No configuration            Log rotation is handled by the framework.
                                      available

`NumberOfGCLogFiles`                  Not Applicable              Log rotation is handled by the framework.

`PrintAdaptiveSizePolicy`             `-Xlog:gc+ergo*=`*level*       Use a *level* of `debug` for most of the information,
                                                                  or a *level* of `trace` for all of what was logged
                                                                  for `PrintAdaptiveSizePolicy`.

`PrintGC`                             `-Xlog:gc`                  Not Applicable

`PrintGCApplicationConcurrentTime`    `-Xlog:safepoint`           Note that `PrintGCApplicationConcurrentTime` and
                                                                  `PrintGCApplicationStoppedTime` are logged on the
                                                                  same tag and aren't separated in the new logging.

`PrintGCApplicationStoppedTime`       `-Xlog:safepoint`           Note that `PrintGCApplicationConcurrentTime` and
                                                                  `PrintGCApplicationStoppedTime` are logged on the
                                                                  same tag and not separated in the new logging.

`PrintGCCause`                        Not Applicable              GC cause is now always logged.

`PrintGCDateStamps`                   Not Applicable              Date stamps are logged by the framework.

`PrintGCDetails`                      `-Xlog:gc*`                 Not Applicable

`PrintGCID`                           Not Applicable              GC ID is now always logged.

`PrintGCTaskTimeStamps`               `-Xlog:gc+task*=debug`         Not Applicable

`PrintGCTimeStamps`                   Not Applicable              Time stamps are logged by the framework.

`PrintHeapAtGC`                       `-Xlog:gc+heap=trace`       Not Applicable

`PrintReferenceGC`                    `-Xlog:gc+ref*=debug`          Note that in the old logging, `PrintReferenceGC` had
                                                                  an effect only if `PrintGCDetails` was also enabled.

`PrintStringDeduplicationStatistics`  `-Xlog:gc+stringdedup*=debug`  Not Applicable

`PrintTenuringDistribution`           `-Xlog:gc+age*=`*level*        Use a *level* of `debug` for the most relevant
                                                                  information, or a *level* of `trace` for all of what
                                                                  was logged for `PrintTenuringDistribution`.

`UseGCLogFileRotation`                Not Applicable              What was logged for `PrintTenuringDistribution`.
------------------------------------  --------------------------  ----------------------------------------------------

### Convert Runtime Logging Flags to Xlog

These legacy flags are no longer recognized and will cause an error if used directly. Use their unified logging equivalent
instead.

Table: Runtime Logging Flags to Xlog Configuration Mapping

---------------------------  -------------------------------------  ------------------------------------------------------------------
Legacy Runtime Flag          Xlog Configuration                     Comment
---------------------------  -------------------------------------  ------------------------------------------------------------------
`TraceExceptions`            `-Xlog:exceptions=info`                Not Applicable

`TraceClassLoading`          `-Xlog:class+load=`*level*             Use *level*=`info` for regular information, or *level*=`debug`
                                                                    for additional information. In Unified Logging syntax,
                                                                    `-verbose:class` equals `-Xlog:class+load=info,class+unload=info`.

`TraceClassLoadingPreorder`  `-Xlog:class+preorder=debug`           Not Applicable

`TraceClassUnloading`        `-Xlog:class+unload=`*level*           Use *level*=`info` for regular information, or *level*=`trace`
                                                                    for additional information. In Unified Logging syntax,
                                                                    `-verbose:class` equals `-Xlog:class+load=info,class+unload=info`.

`VerboseVerification`        `-Xlog:verification=info`              Not Applicable

`TraceClassPaths`            `-Xlog:class+path=info`                Not Applicable

`TraceClassResolution`       `-Xlog:class+resolve=debug`            Not Applicable

`TraceClassInitialization`   `-Xlog:class+init=info`                Not Applicable

`TraceLoaderConstraints`     `-Xlog:class+loader+constraints=info`  Not Applicable


`TraceClassLoaderData`       `-Xlog:class+loader+data=`*level*      Use *level*=`debug` for regular information or *level*=`trace` for
                                                                    additional information.

`TraceSafepointCleanupTime`  `-Xlog:safepoint+cleanup=info`         Not Applicable

`TraceSafepoint`             `-Xlog:safepoint=debug`                Not Applicable

`TraceMonitorInflation`      `-Xlog:monitorinflation=debug`         Not Applicable

`TraceRedefineClasses`       `-Xlog:redefine+class*=`*level*        *level*=`info`, `debug`, and `trace` provide increasing amounts
                                                                    of information.
---------------------------  -------------------------------------  ------------------------------------------------------------------

### -Xlog Usage Examples

The following are `-Xlog` examples.

`-Xlog`
:   Logs all messages by using the `info` level to `stdout` with `uptime`,
    `levels`, and `tags` decorations. This is equivalent to using:

    >   `-Xlog:all=info:stdout:uptime,levels,tags`

`-Xlog:gc`
:   Logs messages tagged with the `gc` tag using `info` level to `stdout`. The
    default configuration for all other messages at level `warning` is in
    effect.

`-Xlog:gc,safepoint`
:   Logs messages tagged either with the `gc` or `safepoint` tags, both using
    the `info` level, to `stdout`, with default decorations. Messages tagged
    with both `gc` and `safepoint` won't be logged.

`-Xlog:gc+ref=debug`
:   Logs messages tagged with both `gc` and `ref` tags, using the `debug` level
    to `stdout`, with default decorations. Messages tagged only with one of the
    two tags won't be logged.

`-Xlog:gc=debug:file=gc.txt:none`
:   Logs messages tagged with the `gc` tag using the `debug` level to a file
    called `gc.txt` with no decorations. The default configuration for all
    other messages at level `warning` is still in effect.

`-Xlog:gc=trace:file=gctrace.txt:uptimemillis,pid:filecount=5,filesize=1024`
:   Logs messages tagged with the `gc` tag using the `trace` level to a
    rotating file set with 5 files with size 1 MB with the base name
    `gctrace.txt` and uses decorations `uptimemillis` and `pid`.

    The default configuration for all other messages at level `warning` is
    still in effect.

`-Xlog:gc::uptime,tid`
:   Logs messages tagged with the `gc` tag using the default 'info' level to
    default the output `stdout` and uses decorations `uptime` and `tid`. The
    default configuration for all other messages at level `warning` is still in
    effect.

`-Xlog:gc*=info,safepoint*=off`
:   Logs messages tagged with at least `gc` using the `info` level, but turns
    off logging of messages tagged with `safepoint`. Messages tagged with both
    `gc` and `safepoint` won't be logged.

`-Xlog:disable -Xlog:safepoint=trace:safepointtrace.txt`
:   Turns off all logging, including warnings and errors, and then enables
    messages tagged with `safepoint`using `trace`level to the file
    `safepointtrace.txt`. The default configuration doesn't apply, because the
    command line started with `-Xlog:disable`.

### Complex -Xlog Usage Examples

The following describes a few complex examples of using the `-Xlog` option.

`-Xlog:gc+class*=debug`
:   Logs messages tagged with at least `gc` and `class` tags using the `debug`
    level to `stdout`. The default configuration for all other messages at the
    level `warning` is still in effect

`-Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt`
:   Logs messages tagged with at least the `gc` and `meta` tags using the
    `trace` level to the file `metatrace.txt` but turns off all messages tagged
    with `class`. Messages tagged with `gc`, `meta`, and `class` aren't be
    logged as `class*` is set to off. The default configuration for all other
    messages at level `warning` is in effect except for those that include
    `class`.

`-Xlog:gc+meta=trace`
:   Logs messages tagged with exactly the `gc` and `meta` tags using the
    `trace` level to `stdout`. The default configuration for all other messages
    at level `warning` is still be in effect.

`-Xlog:gc+class+heap*=debug,meta*=warning,threads*=off`
:   Logs messages tagged with at least `gc`, `class`, and `heap` tags using the
    `trace` level to `stdout` but only log messages tagged with `meta` with
    level. The default configuration for all other messages at the level
    `warning` is in effect except for those that include `threads`.

## Validate Java Virtual Machine Flag Arguments

You use values provided to all Java Virtual Machine (JVM) command-line flags
for validation and, if the input value is invalid or out-of-range, then an
appropriate error message is displayed.

Whether they're set ergonomically, in a command line, by an input tool, or
through the APIs (for example, classes contained in the package
`java.lang.management`) the values provided to all Java Virtual Machine (JVM)
command-line flags are validated. Ergonomics are described in Java Platform,
Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide.

Range and constraints are validated either when all flags have their values set
during JVM initialization or a flag's value is changed during runtime (for
example using the `jcmd` tool). The JVM is terminated if a value violates
either the range or constraint check and an appropriate error message is
printed on the error stream.

For example, if a flag violates a range or a constraint check, then the JVM
exits with an error:

```
java -XX:AllocatePrefetchStyle=5 -version
intx AllocatePrefetchStyle=5 is outside the allowed range [ 0 ... 3 ]
Improperly specified VM option 'AllocatePrefetchStyle=5'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
```

The flag `-XX:+PrintFlagsRanges` prints the range of all the flags. This flag
allows automatic testing of the flags by the values provided by the ranges. For
the flags that have the ranges specified, the type, name, and the actual range
is printed in the output.

For example,

```
intx   ThreadStackSize [ 0 ... 9007199254740987 ] {pd product}
```

For the flags that don't have the range specified, the values aren't displayed
in the print out. For example:

```
size_t NewSize         [   ...                  ] {product}
```

This helps to identify the flags that need to be implemented. The automatic
testing framework can skip those flags that don't have values and aren't
implemented.

## Large Pages

You use large pages, also known as huge pages, as memory pages that are
significantly larger than the standard memory page size (which varies depending
on the processor and operating system). Large pages optimize processor
Translation-Lookaside Buffers.

A Translation-Lookaside Buffer (TLB) is a page translation cache that holds the
most-recently used virtual-to-physical address translations. A TLB is a scarce
system resource. A TLB miss can be costly because the processor must then read
from the hierarchical page table, which may require multiple memory accesses.
By using a larger memory page size, a single TLB entry can represent a larger
memory range. This results in less pressure on a TLB, and memory-intensive
applications may have better performance.

However, using large pages can negatively affect system performance. For
example, when a large amount of memory is pinned by an application, it may
create a shortage of regular memory and cause excessive paging in other
applications and slow down the entire system. Also, a system that has been up
for a long time could produce excessive fragmentation, which could make it
impossible to reserve enough large page memory. When this happens, either the
OS or JVM reverts to using regular pages.

Linux and Windows support large pages.

### Large Pages Support for Linux

Linux supports large pages since version 2.6. To check if your environment
supports large pages, try the following:

```
# cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
...
Hugepagesize: 2048 kB
```

If the output contains items prefixed with "Huge", then your system supports
large pages. The values may vary depending on environment. The `Hugepagesize`
field shows the default large page size in your environment, and the other
fields show details for large pages of this size. Newer kernels have support
for multiple large page sizes. To list the supported page sizes, run this:

```
# ls /sys/kernel/mm/hugepages/
hugepages-1048576kB  hugepages-2048kB
```

The above environment supports 2 MB and 1 GB large pages, but they need to be
configured so that the JVM can use them. When using large pages and not
enabling transparent huge pages (option `-XX:+UseTransparentHugePages`), the
number of large pages must be pre-allocated. For example, to enable 8 GB of
memory to be backed by 2 MB large pages, login as `root` and run:

>   `# echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages`

It is always recommended to check the value of `nr_hugepages` after the request
to make sure the kernel was able to allocate the requested number of large
pages.

> **Note:** The values contained in `/proc` and `/sys` reset after you
  reboot your system, so may want to set them in an initialization script
  (for example, `rc.local` or `sysctl.conf`).

If you configure the OS kernel parameters to enable use of large pages, the
Java processes may allocate large pages for the Java heap as well as other
internal areas, for example:

* Code cache
* Marking bitmaps

Consequently, if you configure the `nr_hugepages` parameter to the size of the
Java heap, then the JVM can still fail to allocate the heap using large pages
because other areas such as the code cache might already have used some of the
configured large pages.

### Large Pages Support for Windows

To use large pages support on Windows, the
administrator must first assign additional privileges to the user who is running
the application:

1.  Select **Control Panel**, **Administrative Tools**, and then **Local
    Security Policy**.
2.  Select **Local Policies** and then **User Rights Assignment**.
3.  Double-click **Lock pages in memory**, then add users and/or groups.
4.  Reboot your system.

Note that these steps are required even if it's the administrator who's running
the application, because administrators by default don't have the privilege to
lock pages in memory.

## Application Class Data Sharing

Application Class Data Sharing (AppCDS) stores classes used
by your applications in an archive file. Since these classes are
stored in a format that can be loaded very quickly (compared
to classes stored in a JAR file), AppCDS can improve the start-up
time of your applications. In addition, AppCDS can reduce the runtime
memory footprint by sharing parts of these classes across multiple
processes.

Classes in the CDS archive are stored in an optimized format that's
about 2 to 5 times larger than classes stored in JAR files or the JDK
runtime image. Therefore, it's a good idea to archive only those
classes that are actually used by your application. These usually
are just a small portion of all available classes. For example, your
application may use only a few APIs provided by a large library.

### Using CDS Archives

By default, in most JDK distributions, unless `-Xshare:off` is
specified, the JVM starts up with a default CDS archive, which
is usually located in `JAVA_HOME/lib/server/classes.jsa` (or
`JAVA_HOME\bin\server\classes.jsa` on Windows). This
archive contains about 1300 core library classes that are used
by most applications.

To use CDS for the exact set of classes used by your application,
you can use the `-XX:SharedArchiveFile` option, which has the
general form:

>   `-XX:SharedArchiveFile=<static_archive>:<dynamic_archive>`

-   The `<static_archive>` overrides the default CDS archive.
-   The `<dynamic_archive>` provides additional classes that can
    be loaded on top of those in the `<static_archive>`.
-   On Windows, the above path delimiter `:` should be replaced with `;`

The names "static" and "dynamic" are used for historical reasons. The dynamic
archive, while still useful, supports fewer optimizations than
available for the static CDS archive. If the full set of CDS/AOT
optimizations are desired, consider using the AOT cache described below.

The JVM can use up to two archives. To use only a single `<static_archive>`,
you can omit the `<dynamic_archive>` portion:

>   `-XX:SharedArchiveFile=<static_archive>`

For convenience, the `<dynamic_archive>` records the location of the
`<static_archive>`. Therefore, you can omit the `<static_archive>` by saying only:

>   `-XX:SharedArchiveFile=<dynamic_archive>`

### Manually Creating CDS Archives

CDS archives can be created manually using several methods:

-   `-Xshare:dump`
-   `-XX:ArchiveClassesAtExit`
-   `jcmd VM.cds`

One common operation in all these methods is a "trial run", where you run
the application once to determine the classes that should be stored
in the archive.

#### Creating a Static CDS Archive File with -Xshare:dump

The following steps create a static CDS archive file that contains all the classes
used by the `test.Hello` application.

1.  Create a list of all classes used by the `test.Hello` application. The
    following command creates a file named `hello.classlist` that contains a
    list of all classes used by this application:

    >   `java -Xshare:off -XX:DumpLoadedClassList=hello.classlist -cp hello.jar test.Hello`

    The classpath specified by the `-cp` parameter must contain only
    JAR files.

2.  Create a static archive, named `hello.jsa`, that contains all the classes
    in `hello.classlist`:

    >   `java -Xshare:dump -XX:SharedArchiveFile=hello.jsa -XX:SharedClassListFile=hello.classlist -cp hello.jar`

3.  Run the application `test.Hello` with the archive `hello.jsa`:

    >   `java -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello`

4.  **Optional** Verify that the `test.Hello` application is using the class
    contained in the `hello.jsa` shared archive:

    >   `java -XX:SharedArchiveFile=hello.jsa -cp hello.jar -Xlog:class+load test.Hello`

    The output of this command should contain the following text:

    >   `[info][class,load] test.Hello source: shared objects file`

By default, when the `-Xshare:dump` option is used, the JVM runs in interpreter-only mode
(as if the `-Xint` option were specified). This is required for generating deterministic output
in the shared archive file. I.e., the exact same archive will be generated, bit-for-bit, every time
you dump it. However, if deterministic output is not needed, and you have a large classlist, you can
explicitly add `-Xmixed` to the command-line to enable the JIT compiler. This will speed up
the archive creation.

#### Creating a Dynamic CDS Archive File with -XX:ArchiveClassesAtExit

Advantages of dynamic CDS archives are:

-   They usually use less disk space, since they don't need to store the
    classes that are already in the static archive.
-   They are created with one fewer step than the comparable static archive.

The following steps create a dynamic CDS archive file that contains the classes
that are used by the `test.Hello` application, excluding those that are already in
the default CDS archive.

1.  Create a dynamic CDS archive, named `hello.jsa`, that contains all the classes
    in `hello.jar` loaded by the application `test.Hello`:

    >   `java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello`

2.  Run the application `test.Hello` with the shared archive `hello.jsa`:

    >   `java -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello`

3. **Optional** Repeat step 4 of the previous section to verify that the `test.Hello` application is using the class
    contained in the `hello.jsa` shared archive.

It's also possible to create a dynamic CDS archive with a non-default static CDS archive. E.g.,

>   `java -XX:SharedArchiveFile=base.jsa -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello`

To run the application using this dynamic CDS archive:

>   `java -XX:SharedArchiveFile=base.jsa:hello.jsa -cp hello.jar Hello`

(On Windows, the above path delimiter `:` should be replaced with `;`)

As mention above, the name of the static archive can be skipped:

>   `java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello`

#### Creating CDS Archive Files with jcmd

The previous two sections require you to modify the application's start-up script
in order to create a CDS archive. Sometimes this could be difficult, for example,
if the application's class path is set up by complex routines.

The `jcmd VM.cds` command provides a less intrusive way for creating a CDS
archive by connecting to a running JVM process. You can create either a
static:

>   `jcmd <pid> VM.cds static_dump my_static_archive.jsa`

or a dynamic archive:

>   `jcmd <pid> VM.cds dynamic_dump my_dynamic_archive.jsa`

To use the resulting archive file in a subsequent run of the application
without modifying the application's start-up script, you can use the
following technique:

>   `env JAVA_TOOL_OPTIONS=-XX:SharedArchiveFile=my_static_archive.jsa bash app_start.sh`

Note: to use `jcmd <pid> VM.cds dynamic_dump`, the JVM process identified by `<pid>`
must be started with `-XX:+RecordDynamicDumpInfo`, which can also be passed to the
application start-up script with the same technique:

>   `env JAVA_TOOL_OPTIONS=-XX:+RecordDynamicDumpInfo bash app_start.sh`


### Creating Dynamic CDS Archive File with -XX:+AutoCreateSharedArchive

`-XX:+AutoCreateSharedArchive` is a more convenient way of creating/using
CDS archives. Unlike the methods of manual CDS archive creation described
in the previous section, with `-XX:+AutoCreateSharedArchive`, it's no longer
necessary to have a separate trial run. Instead, you can always run the
application with the same command-line and enjoy the benefits of CDS automatically.

>   `java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello`

If the specified archive file exists and was created by the same version of the JDK,
then it will be loaded as a dynamic archive; otherwise it is ignored at VM startup.

At VM exit, if the specified archive file does not exist, it will be created.
If it exists but was created with a different (but post JDK 19) version of the JDK,
then it will be replaced. In both cases the archive will be ready to be loaded the
next time the JVM is launched with the same command line.

If the specified archive file exists but was created by a JDK version prior
to JDK 19, then it will be ignored: neither loaded at startup, nor replaced at exit.

Developers should note that the contents of the CDS archive file are specific
to each build of the JDK. Therefore, if you switch to a different JDK build,
`-XX:+AutoCreateSharedArchive` will automatically recreate the archive to
match the JDK. If you intend to use this feature with an existing
archive, you should make sure that the archive is created by at least version
19 of the JDK.


### Restrictions on Class Path and Module Path

-   Neither the class path (`-classpath` and `-Xbootclasspath/a`)
    nor the module path (`--module-path`) can contain non-empty directories.

-   Only modular JAR files are supported in `--module-path`. Exploded
    modules are not supported.

-   The class path used at archive creation time must be the same as
    (or a prefix of) the class path used at run time. (There's no
    such requirement for the module path.)

-   The CDS archive cannot be loaded if any JAR files in the class path or
    module path are modified after the archive is generated.

### Module related options

The following module related options are supported by CDS: `--module-path`, `--module`,
`--add-modules`, and `--enable-native-access`.

The values for these options (if specified), should be identical when creating and using the
CDS archive. Otherwise, if there is a mismatch of any of these options, the CDS archive may be
partially or completely disabled, leading to lower performance.

- If the `AOTClassLinking` option (see below) *was* enabled during CDS archive creation, the CDS archive
  cannot be used, and the following error message is printed:

  `CDS archive has aot-linked classes. It cannot be used when archived full module graph is not used`

- If the `AOTClassLinking` option *was not* enabled during CDS archive creation, the CDS archive
  can be used, but the "archived module graph" feature will be disabled. This can lead to increased
  start-up time.

To diagnose problems with the AOT options, you can add `-Xlog:aot` to the application's VM
arguments. For example, if `--add-modules jdk.jconsole` was specified during archive creation
and `--add-modules jdk.incubator.vector` is specified during runtime, the following messages will
be logged:

 `Mismatched values for property jdk.module.addmods`

 `runtime jdk.incubator.vector dump time jdk.jconsole`

 `subgraph jdk.internal.module.ArchivedBootLayer cannot be used because full module graph is disabled`

If any of the VM options `--upgrade-module-path`, `--patch-module` or
`--limit-modules` are specified, CDS is disabled. This means that the
JVM will execute without loading any CDS archives. In addition, if
you try to create a CDS archive with any of these 3 options specified,
the JVM will report an error.

## Ahead-of-Time Cache

The JDK supports ahead-of-time (AOT) optimizations that can be performed before an
application is executed. One example is Class Data Sharing (CDS), as described above,
that parses classes ahead of time. AOT optimizations can improve the start-up and
warm-up performance of Java applications.

The Ahead-of-Time Cache (AOT cache) is a container introduced in JDK 24 for
storing artifacts produced by AOT optimizations. The AOT cache currently contains
Java classes and heap objects. In future JDK releases, the AOT cache may contain additional
artifacts, such as execution profiles and compiled methods.

An AOT cache is specific to a combination of the following:

-   A particular application (as expressed by `-classpath`, `-jar`, or `--module-path`.)
-   A particular JDK release.
-   A particular OS and CPU architecture.

If any of the above changes, you must recreate the AOT cache.

The deployment of the AOT cache is divided into three phases:

-   **Training:** We execute the application with a representative work-load
    to gather statistical data that tell us what artifacts should be included
    into the AOT cache. The data are saved in an *AOT Configuration* file.

-   **Assembly:** We use the AOT Configuration file to produce an AOT cache.

-   **Production:** We execute the application with the AOT cache for better
    start-up and warm-up performance.

The AOT cache can be used with the following command-line options:

`-XX:AOTCache=`*cachefile*
:   Specifies the location of the AOT cache. The standard extension for *cachefile* is `.aot`.
    This option cannot be used together with `-XX:AOTCacheOutput`.

    This option is compatible with `AOTMode` settings of `on`, `create`, or `auto` (the default).
    The *cachefile* is read in AOT modes `on` and `auto`, and is ignored by mode `off`.
    The *cachefile* is written by AOT mode `create`.  In that case, this option is
    equivalent to `-XX:AOTCacheOutput=`*cachefile*.

`-XX:AOTCacheOutput=`*cachefile*
:   Specifies the location of the AOT cache to write. The standard extension for *cachefile* is `.aot`.
    This option cannot be used together with `-XX:AOTCache`.

    This option is compatible with `AOTMode` settings of `record`, `create`, or `auto` (the default).

`-XX:AOTConfiguration=`*configfile*
:   Specifies the AOT Configuration file for the JVM to write to or read from.
    The standard extension for *configfile* is `.aotconfig`.

    This option is compatible with `AOTMode` settings of `record`, `create`, or `auto` (the default).
    The *configfile* is read by AOT mode `create`, and written by the other applicable modes.
    If the AOT mode is `auto`, then `AOTCacheOutput` must also be present.

`-XX:AOTMode=`*mode*
:   Specifies the AOT Mode for this run.
    *mode* must be one of the following: `auto`, `off`, `record`, `create`, or `on`.

-   `auto`: This AOT mode is the default, and takes effect if no `-XX:AOTMode` option
    is present.  It automatically sets the AOT mode to `record`, `on`, or `off`, as follows:
     - If `-XX:AOTCacheOutput=`*cachefile* is specified, the AOT mode is changed to `record`
       (a training run, with a subsequent `create` operation).
     - Otherwise, if an AOT cache can be loaded, the AOT mode is changed to `on` (a production run).
     - Otherwise, the AOT mode is changed to `off` (a production run with no AOT cache).

-   `off`: No AOT cache is used.
    Other AOT command line options are ignored.

-   `record`: Execute the application in the training phase.
     At least one of `-XX:AOTConfiguration=`*configfile* and/or
     `-XX:AOTCacheOutput=`*cachefile* must be specified.
     If `-XX:AOTConfiguration=`*configfile* is specified, the JVM gathers
     statistical data and stores them into *configfile*.
     If `-XX:AOTConfiguration=`*configfile* is not specified, the JVM uses
     a temporary file name, which may be the string `AOTCacheOutput+".config"`,
     or else a fresh implementation-dependent temporary file name.
     If `-XX:AOTCacheOutput=`*cachefile* is specified, a second JVM process is launched
     to perform the Assembly phase to write the optimization artifacts into *cachefile*.

     Extra JVM options can be passed to the second JVM process using the environment
     variable `JDK_AOT_VM_OPTIONS`, with the same format as the environment variable
     `JAVA_TOOL_OPTIONS`, which is
     [defined by JVMTI](https://docs.oracle.com/en/java/javase/24/docs/specs/jvmti.html#tooloptions).

-   `create`: Perform the Assembly phase. `-XX:AOTConfiguration=`*configfile* must be
     specified.
     The JVM reads history and statistics
     from *configfile* and writes the optimization artifacts into *cachefile*.
     Note that the application itself is not executed in this phase.

-   `on`: Execute the application in the Production phase.
     If `-XX:AOTCache=`*cachefile* is specified, the JVM tries to
     load *cachefile* as the AOT cache. Otherwise, the JVM tries to load
     a *default CDS archive* from the JDK installation directory as the AOT cache.

     The loading of an AOT cache can fail for a number of reasons:

     - You are trying to use the AOT cache with an incompatible application, JDK release,
       or OS/CPU.

     - The specified *cachefile* does not exist or is not accessible.

     - Incompatible JVM options are used (for example, certain JVMTI options).

       Since the AOT cache is an optimization feature, there's no guarantee that it will be
       compatible with all possible JVM options. See [JEP 483](https://openjdk.org/jeps/483),
       section **Consistency of training and subsequent runs** for a representative
       list of scenarios that may be incompatible with the AOT cache.

       These scenarios usually involve arbitrary modification of classes for diagnostic
       purposes and are typically not relevant for production environments.

     When the AOT cache fails to load:

     - If `AOTMode` was originally `auto`, the JVM will continue execution without using the
       AOT cache. This is the recommended mode for production environments, especially
       when you may not have complete control of the command-line (e.g., your
       application's launch script may allow users to inject options to the command-line).
       This allows your application to function correctly, although sometimes it may not
       benefit from the AOT cache.

     - If `AOTMode` is `on`, the JVM will print an error message and exit immediately. This
       mode should be used only as a "fail-fast" debugging aid to check if your command-line
       options are compatible with the AOT cache. An alternative is to run your application with
       `-XX:AOTMode=auto -Xlog:aot` to see if the AOT cache can be used or not.

`-XX:+AOTClassLinking`
:   If this option is enabled, the JVM will perform more advanced optimizations (such
    as ahead-of-time resolution of invokedynamic instructions)
    when creating the AOT cache. As a result, the application will see further improvements
    in start-up and warm-up performance. However, an AOT cache created with this option
    cannot be used when certain command-line parameters are specified in
    the Production phase. Please see [JEP 483](https://openjdk.org/jeps/483) for a
    detailed discussion of `-XX:+AOTClassLinking` and its restrictions.

    When `-XX:AOTMode` *is used* in the command-line, `AOTClassLinking` is automatically
    enabled. To disable it, you must explicitly pass the `-XX:-AOTClassLinking` option.

    When `-XX:AOTMode` *is not used* in the command-line,  `AOTClassLinking` is disabled by
    default to provide full compatibility with traditional CDS options such as `-Xshare:dump.

The first occurrence of the special sequence `%p` in `*configfile* and `*cachefile* is replaced
with the process ID of the JVM process launched in the command-line, and likewise the
first occurrence of `%t` is replace by the JVM's startup timestamp.
(After replacement there must be no further occurrences of `%p` or `%t`, to prevent
problems with sub-processes.)  For example:

>   `java -XX:AOTConfiguration=foo%p.aotconfig -XX:AOTCacheOutput=foo%p.aot -cp foo.jar Foo`

will create two files: `foopid123.aotconfig` and `foopid123.aot`, where `123` is the
process ID of the JVM that has executed the application `Foo`.

## Performance Tuning Examples

You can use the Java advanced runtime options to optimize the performance of
your applications.

### Tuning for Higher Throughput

Use the following commands and advanced options to achieve higher
throughput performance for your application:

>   `java -server -XX:+UseParallelGC -XX:+UseLargePages -Xmn10g  -Xms26g -Xmx26g`

### Tuning for Lower Response Time

Use the following commands and advanced options to achieve lower
response times for your application:

>   `java -XX:+UseG1GC -XX:MaxGCPauseMillis=100`

### Keeping the Java Heap Small and Reducing the Dynamic Footprint of Embedded Applications

Use the following advanced runtime options to keep the Java heap small and
reduce the dynamic footprint of embedded applications:

>   `-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5`

> **Note:** The defaults for these two options are 70% and 40% respectively. Because
performance sacrifices can occur when using these small settings, you should
optimize for a small footprint by reducing these settings as much as possible
without introducing unacceptable performance degradation.

## Exit Status

The following exit values are typically returned by the launcher when the
launcher is called with the wrong arguments, serious errors, or exceptions
thrown by the JVM. However, a Java application may choose to return any value
by using the API call `System.exit(exitValue)`. The values are:

-   `0`: Successful completion

-   `>0`: An error occurred
