Java - 您的应用程序启动器
介绍 Java 工具
java - 启动 Java 应用程序
概要
Windows: javaw
命令与 java
相同,只是使用 javaw
时没有关联的控制台窗口。当您不希望出现命令提示符窗口时,请使用 javaw
。但是,如果启动失败,javaw
启动器将显示一个带有错误信息的对话框。
要启动类文件
java [options] mainclass [args...]
要启动 JAR 文件中的主类
java [options] -jar jarfile [args...]
要启动模块中的主类
java [options] -m module[/mainclass] [args...]
或者
java [options] --module module[/mainclass] [args...]
要启动单个源文件程序
java [options] source-file [args...]
[选项]
可选:指定用空格分隔的命令行选项。
主类
指定要启动的类的名称。跟随类名的命令行条目是主方法的参数。
-jar jarfile
执行封装在 JAR 文件中的程序。jarfile
参数是 JAR 文件的名称,该文件包含一个清单,其中包含形式为 Main-Class:classname
的行,该行定义了具有 public static void main(String[] args)
方法的类,该方法用作应用程序的起点。当您使用 -jar
时,指定的 JAR 文件是所有用户类的来源,其他类路径设置将被忽略。如果您使用 JAR 文件,请参阅 jar
命令。
-m
或 --module module[/mainclass]
执行模块中指定的主类 mainclass
(如果给出),或者,如果没有给出,则执行模块中的值。换句话说,mainclass
可用于模块未指定时,或用于在指定时覆盖该值。
源文件
仅用于启动单个 源文件
程序。在使用源文件模式时,指定包含主类的源文件。
[args...] 可选:跟随 mainclass
、source-file
、-jar jarfile
和 -m
或 --module module/mainclass
的参数作为参数传递给主类。
描述
java
命令启动 Java 应用程序。它通过启动 Java 运行时环境、加载指定的类并调用该类的 main()
方法来实现。该方法必须声明为 public
和 static
,它不能返回值,并且必须接受一个 String 数组作为参数。方法声明具有以下形式
class HelloWorld {
public static void main(String[] args) { }
}
在源文件模式下,java
命令可以启动在源文件中声明的类。
默认情况下,第一个不是 java
命令选项的参数是将要调用的类的完全限定名称。如果指定了 -jar
,则其参数是包含应用程序的类和资源文件的 JAR 文件的名称。启动类必须由其清单文件中的 Main-Class
清单标题指示。
类文件名或 JAR 文件名后的参数将传递给 main()
方法。
使用源文件模式启动单文件源代码程序
要启动在源文件中声明的类,请在源文件模式下运行 java 启动器。进入源文件模式由 java 命令行上的两个项目决定
- 命令行上第一个不是选项或选项一部分的项目。换句话说,命令行中原本应该是主类名的项目。
--source
版本选项(如果存在)。
如果该类标识一个具有 .java
扩展名的现有文件,或者如果指定了 --source
选项,则选择 源文件
模式。然后编译并运行源文件。--source
选项可用于指定源代码的源版本或 N。这决定了可以使用哪些 API。当您设置 --source N
时,您只能使用在 JDK N 中定义的公共 API。
如果该文件没有 .java
扩展名,则必须使用 --source
选项来告诉 java
命令使用源文件模式。--source
选项用于源文件是将要执行的“脚本”并且源文件的名称不遵循 Java 源文件的正常命名约定。
在 源文件
模式下,效果就好像源文件被编译到内存中,并且在源文件中找到的第一个类被执行。在原始命令行中,源文件名后的任何参数在编译的类执行时都会传递给它。
例如,如果一个文件名为 HelloWorld.java
并且包含一个名为 hello.World
的类,那么启动该类的源文件模式命令将是
java HelloWorld.java
该示例说明该类可以位于命名包中,并且不需要位于未命名包中。这种源文件模式的使用在非正式上等同于使用以下两个命令,其中 hello.World 是包中的类名
javac -d memory HelloWorld.java
java -cp memory hello.World
在源文件模式下,任何额外的命令行选项将按以下方式处理
- 启动器扫描在源文件之前指定的选项,以查找任何与编译源文件相关的选项。
- 这包括:
--class-path
、--module-path
、--add-exports
、--add-modules
、--limit-modules
、--patch-module
、--upgrade-module-path
以及这些选项的任何变体形式。它还包括 JEP 12 中描述的 --enable-preview 选项:预览语言和 VM 功能。 - 没有为编译器传递任何其他选项(例如 -processor 或
-Werror
)提供任何规定。 - 命令行参数文件(
@
文件)可以使用标准方式。要调用 VM 或程序的任何长参数列表都可以放在命令行上指定的文件中,方法是在文件名之前加上一个 @ 字符。
在源文件模式下,编译过程如下
- 将考虑与编译环境相关的任何命令行选项。
- 不会找到和编译其他源文件,就好像源路径设置为一个空值。
- 注释处理被禁用,就好像
-proc:none
生效一样。 - 如果通过 --source 选项指定了版本,则该值将用作编译的隐式
--release
选项的参数。这将设置编译器接受的源版本和源文件中的代码可能使用的系统 API。 - 源文件在未命名模块的上下文中进行编译。
- 源文件应包含一个或多个顶级类,第一个类被视为要执行的类。
- 编译器不强制执行 JLS §7.6 末尾定义的可选限制,即命名包中的类型应存在于一个名称由类型名后跟 .java 扩展名组成的文件中。
- 如果源文件包含错误,则相应的错误消息将写入标准错误流,并且启动器将退出并返回非零退出代码。
在源文件模式下,执行过程如下
- 要执行的类是源文件中找到的第一个顶级类。它必须包含标准
public static void main(String[])
方法的声明。 - 编译后的类由一个自定义类加载器加载,该加载器委托给应用程序类加载器。这意味着应用程序类路径上出现的类不能引用源文件中声明的任何类。
- 编译后的类在未命名模块的上下文中执行,就像
--add-modules=ALL-DEFAULT
生效一样。这将添加到命令行中可能指定的任何其他--add-module
选项。 - 命令行中文件名之后出现的任何参数都以明显的方式传递给标准主方法。
- 如果应用程序类路径上存在一个类,其名称与要执行的类的名称相同,则会发生错误。
使用 JDK_JAVA_OPTIONS 启动器环境变量
JDK_JAVA_OPTIONS
将其内容追加到从命令行解析的选项之前。JDK_JAVA_OPTIONS
环境变量的内容是通过空格字符(由 isspace()
确定)分隔的参数列表。这些参数将追加到传递给 java 启动器的命令行参数之前。环境变量的编码要求与系统上的 java
命令行相同。JDK_JAVA_OPTIONS
环境变量内容的处理方式与命令行中指定的内容相同。
可以使用单引号 '
或双引号 "
将包含空格字符的参数括起来。打开引号和第一个匹配的关闭引号之间的所有内容都将通过简单地删除一对引号来保留。如果找不到匹配的引号,启动器将中止并显示错误消息。@
文件在命令行中指定时受支持。但是,与 @
文件一样,不支持使用通配符。为了减轻对 JDK_JAVA_OPTIONS
行为的潜在滥用,环境变量中不允许指定主类的选项(例如 -jar
)或导致 java 启动器在不执行主类的情况下退出(例如 -h
)。如果环境变量中出现任何这些选项,启动器将中止并显示错误消息。当设置 JDK_JAVA_OPTIONS
时,启动器会向 stderr 打印一条消息作为提醒。
示例
export JDK_JAVA_OPTIONS='-g @file1 -Dprop=value @file2 -Dws.prop="white spaces"'
java -Xint @file3
等效于命令行
java -g @file1 -Dprop=value @file2 -Dws.prop="white spaces" -Xint @file3
Java 选项概述
java
命令支持以下类别中的各种选项
Java 标准选项:所有 Java 虚拟机 (JVM) 实现都保证支持的选项。它们用于常见的操作,例如检查 JRE 的版本、设置类路径、启用详细输出等。
Java 额外选项:特定于 Java HotSpot 虚拟机的通用选项。它们不保证所有 JVM 实现都支持,并且可能会发生变化。这些选项以
-X
开头。
不建议将高级选项用于日常使用。这些是用于调整 Java HotSpot 虚拟机操作特定区域的开发人员选项,这些选项通常具有特定的系统要求,并且可能需要对系统配置参数进行特权访问。性能调整示例中提供了几个性能调整示例。这些选项不保证所有 JVM 实现都支持,并且可能会发生变化。高级选项以 -XX
开头。
- 高级运行时选项:控制 Java HotSpot VM 的运行时行为。
- 高级 JIT 编译器选项:控制 Java HotSpot VM 执行的动态即时 (JIT) 编译。
- 高级可服务性选项:启用收集系统信息和执行广泛的调试。
- 高级垃圾回收选项:控制 Java HotSpot 如何执行垃圾回收 (GC)
布尔选项用于启用默认情况下禁用的功能或禁用默认情况下启用的功能。此类选项不需要参数。布尔 -XX
选项使用加号 (-XX:+OptionName
) 启用,使用减号 (-XX:-OptionName
) 禁用。
对于需要参数的选项,参数可以使用空格、冒号 (:
) 或等号 (=
) 与选项名称分隔,或者参数可以直接跟随选项(确切的语法因选项而异)。如果预期您以字节为单位指定大小,则可以使用无后缀,或使用后缀 k
或 K
表示千字节 (KB
)、m
或 M
表示兆字节 (MB
) 或 g
或 G
表示吉字节 (GB
)。例如,要将大小设置为 8 GB,可以将 8g
、8192m
、8388608k
或 8589934592
指定为参数。如果预期您指定百分比,则使用 0
到 1
之间的数字。例如,对于 25%
,指定 0.25
。
Java 标准选项
这些是所有 JVM 实现都支持的最常用的选项。
-agentlib:libname[=options]
加载指定的本机代理库。在库名称之后,可以使用逗号分隔的特定于库的选项列表。
Linux 和 macOS:如果指定了选项
-agentlib:foo
,则 JVM 会尝试加载名为libfoo.so
的库,该库位于LD_LIBRARY_PATH
系统变量指定的目录中(在 macOS 上,此变量为DYLD_LIBRARY_PATH
)。Windows:如果指定了选项
-agentlib:foo
,则 JVM 会尝试加载名为foo.dll
的库,该库位于PATH
系统变量指定的目录中。
以下示例显示了如何加载 Java 调试线协议 (JDWP) 库并在端口 8000
上监听套接字连接,并在主类加载之前挂起 JVM
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
-agentpath:pathname[=options]
加载由绝对路径名指定的本机代理库。此选项等效于 -agentlib,但使用库的完整路径和文件名。
--class-path classpath
、-classpath classpath
或 -cp classpath
用于搜索类文件的目录、JAR 档案和 ZIP 档案的分号 (;
) 分隔列表。
指定类路径会覆盖 CLASSPATH 环境变量的任何设置。如果未使用类路径选项并且未设置类路径,则用户类路径将包含当前目录 (.
)。
作为一种特殊的便利,包含星号 (*) 基本名称的类路径元素被认为等效于指定目录中所有具有扩展名 .jar 或 .JAR 的文件的列表。Java 程序无法区分这两个调用。例如,如果目录 mydir 包含 a.jar 和 b.JAR,则类路径元素 mydir/* 将扩展为 A.jar:b.JAR,只是 JAR 文件的顺序未指定。指定目录中的所有 .jar 文件(即使是隐藏文件)都包含在列表中。由星号 (*) 组成的类路径条目将扩展为当前目录中所有 jar 文件的列表。CLASSPATH 环境变量(如果已定义)也会类似地扩展。任何类路径通配符扩展都发生在 Java VM 启动之前。Java 程序永远不会看到未扩展的通配符,除非通过查询环境,例如通过调用 System.getenv("CLASSPATH")。
--disable-@files
可用于命令行上的任何位置,包括参数文件,以防止进一步的 @filename 扩展。此选项在选项之后停止扩展 @-argfiles。
--enable-preview
允许类依赖于该版本的预览功能。
--module-path modulepath...
或 -p modulepath
分号 (;
) 分隔的目录列表,其中每个目录都是模块的目录。
--upgrade-module-path modulepath...
分号 (;
) 分隔的目录列表,其中每个目录都是模块的目录,这些模块替换运行时映像中可升级的模块。
--add-modules module[,module...]
指定除了初始模块之外要解析的根模块。module 也可以是 ALL-DEFAULT、ALL-SYSTEM 和 ALL-MODULE-PATH。
--list-modules
列出可观察的模块,然后退出。
-d module-name
或 --describe-module module-name
描述指定的模块,然后退出。
--dry-run
创建 VM 但不执行主方法。此 --dry-run 选项可能有助于验证命令行选项,例如模块系统配置。
--validate-modules
验证所有模块并退出。此选项有助于查找模块路径上模块的冲突和其他错误。
-Dproperty=value 设置系统属性值。属性变量是一个没有空格的字符串,表示属性的名称。值变量是一个表示属性值的字符串。如果值是一个包含空格的字符串,则将其括在引号中(例如 -Dfoo="foo bar")。
-disableassertions[:[packagename]...|:classname] 或 -da[:[packagename]...|:classname]
禁用断言。默认情况下,所有包和类中的断言都已禁用。如果没有任何参数,-disableassertions
(-da
) 会禁用所有包和类中的断言。如果 packagename
参数以 ...
结尾,则该开关会禁用指定包及其所有子包中的断言。如果参数只是 ...
,则该开关会禁用当前工作目录中未命名包中的断言。如果使用 classname 参数,则该开关会禁用指定类中的断言。
-disableassertions
(-da
) 选项适用于所有类加载器和系统类(没有类加载器)。此规则有一个例外:如果该选项没有参数,则它不适用于系统类。这使得可以轻松地禁用所有类(系统类除外)中的断言。-disablesystemassertions
选项使您可以禁用所有系统类中的断言。要显式地在特定包或类中启用断言,请使用 -enableassertions
(-ea
) 选项。这两个选项可以同时使用。例如,要运行 MyClass 应用程序,在包 com.wombat.fruitbat
(及其所有子包)中启用断言,但在类 com.wombat.fruitbat.Brickbat
中禁用断言,请使用以下命令
java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyClass
-disablesystemassertions
或 -dsa
禁用所有系统类中的断言。
-enableassertions[:[packagename]...|:classname]
或 -ea[:[packagename]...|:classname]
启用断言。默认情况下,所有包和类中的断言都已禁用。如果没有任何参数,-enableassertions
(-ea
) 会启用所有包和类中的断言。如果 packagename
参数以 ...
结尾,则该开关会启用指定包及其所有子包中的断言。如果参数只是 ...
,则该开关会启用当前工作目录中未命名包中的断言。如果使用 classname 参数,则该开关会启用指定类中的断言。
-enableassertions
(-ea
) 选项适用于所有类加载器和系统类(没有类加载器)。此规则有一个例外:如果该选项没有参数,则它不适用于系统类。这使得可以轻松地启用所有类(系统类除外)中的断言。
-enablesystemassertions
选项提供一个单独的开关来启用所有系统类中的断言。要显式地在特定包或类中禁用断言,请使用 -disableassertions
(-da
) 选项。如果单个命令包含这些开关的多个实例,则会在加载任何类之前按顺序处理它们。例如,要运行 MyClass
应用程序,仅在包 com.wombat.fruitbat
(及其所有子包)中启用断言,但在类 com.wombat.fruitbat.Brickbat
中禁用断言,请使用以下命令
java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyClass
-enablesystemassertions
或 -esa
启用所有系统类中的断言。
-help
、-h
或 -?
将帮助消息打印到错误流。
--help
将帮助消息打印到输出流。
-javaagent:jarpath[=options]
加载指定的 Java 编程语言代理。
--show-version
将产品版本打印到输出流并继续。
-showversion
将产品版本打印到错误流并继续。
--show-module-resolution
在启动期间显示模块解析输出。
-splash:imagepath
显示带有 imagepath
指定的图像的启动画面。 如果可用,HiDPI 缩放图像会自动支持并使用。 未缩放的图像文件名(例如 image.ext
)应始终作为 -splash
选项的参数传递。 最合适的缩放图像会自动选择。
例如,要显示启动应用程序时 images
目录中的 splash.gif
文件,请使用以下选项
-splash:images/splash.gif
-verbose:class
显示有关每个加载类的信息。
-verbose:gc
显示有关每个垃圾回收 (GC) 事件的信息。
-verbose:jni
显示有关使用本机方法和其他 Java 本机接口 (JNI) 活动的信息。
-verbose:module
显示有关正在使用的模块的信息。
--version
将产品版本打印到错误流并退出。
-version
将产品版本打印到输出流并退出。
-X
将有关额外选项的帮助信息打印到错误流。
--help-extra
将有关额外选项的帮助信息打印到输出流。
@argfile
指定 java 命令使用的以 @ 开头的多个参数文件。 由于类路径中需要的 .jar 文件,java 命令行通常很长。 @argfile 选项通过使启动器能够在 shell 扩展后但参数处理之前扩展参数文件的内容来克服命令行长度限制。 参数文件中的内容会扩展,因为否则它们将一直指定在命令行上,直到遇到 -Xdisable-@files
选项为止。
参数文件还可以包含主类名和所有选项。 如果参数文件包含 java 命令所需的所有选项,则命令行可以简单地为
java @argfile
Java 的额外选项
以下 java 选项是特定于 Java HotSpot 虚拟机的通用选项。
-Xbatch
禁用后台编译。 默认情况下,JVM 将方法作为后台任务编译,在后台编译完成之前以解释器模式运行方法。 -Xbatch 标志禁用后台编译,以便所有方法的编译都作为前台任务进行,直到完成。 此选项等效于 -XX:-BackgroundCompilation。
-Xbootclasspath/a:directories|zip|JAR-files
指定要附加到默认引导类路径末尾的目录、JAR 文件和 ZIP 存档列表。
Linux 和 macOS: 此列表中的实体由冒号 (
:
) 分隔。Windows: 此列表中的实体由分号 (
;
) 分隔。
-Xcheck:jni
对 Java 本机接口 (JNI) 函数执行额外的检查。 具体来说,它会在处理 JNI 请求之前验证传递给 JNI 函数的参数和运行时环境数据。 它还会检查 JNI 调用之间是否有未决异常。 遇到任何无效数据都表明本机代码存在问题,在这种情况下,JVM 会以不可恢复的错误终止。 使用此选项时,预计性能会下降。
-Xcomp
强制在第一次调用时编译方法。 默认情况下,Client VM (-client) 执行 1,000 次解释方法调用,而 Server VM (-server) 执行 10,000 次解释方法调用,以收集信息以进行高效编译。 指定 -Xcomp 选项会禁用解释方法调用,以提高编译性能,但会降低效率。 您还可以使用 -XX:CompileThreshold 选项更改编译前解释方法调用的次数。
-Xdebug
不执行任何操作。 为向后兼容性提供。
-Xdiag
显示其他诊断消息。
-Xfuture
启用严格的类文件格式检查,这些检查强制严格遵守类文件格式规范。 开发人员在开发新代码时应使用此标志。 在将来的版本中,更严格的检查可能会成为默认设置。
-Xint
以纯解释模式运行应用程序。 禁用编译为本机代码,所有字节码都由解释器执行。 此模式下不存在即时 (JIT) 编译器提供的性能优势。
-Xinternalversion
显示比 -version 选项更详细的 JVM 版本信息,然后退出。
-Xloggc:option
启用 JVM 统一日志记录框架。 将 GC 状态记录到带有时间戳的文件中。
-Xlog:option
使用 Java 虚拟机 (JVM) 统一日志记录框架配置或启用日志记录。 请参阅使用 JVM 统一日志记录框架启用日志记录。
-Xmixed
由解释器执行所有字节码,除了热方法,热方法会编译为本机代码。
-Xmn size
设置年轻代 (育苗器) 堆的初始大小和最大大小(以字节为单位)。 附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示吉字节。 堆的年轻代区域用于新对象。 GC 在此区域中执行的频率高于其他区域。 如果年轻代的大小太小,则会执行大量次要垃圾回收。 如果大小太大,则只会执行完全垃圾回收,这可能需要很长时间才能完成。
Oracle 建议您将年轻代的大小保持在总堆大小的 25%
以上和 50%
以下。 以下示例显示了如何使用各种单位将年轻代的初始大小和最大大小设置为 256 MB
-Xmn256m
-Xmn262144k
-Xmn268435456
您可以使用 -XX:NewSize
设置初始大小,使用 -XX:MaxNewSize
设置最大大小,而不是使用 -Xmn
选项来设置年轻代堆的初始大小和最大大小。
-Xms size 设置堆的最小大小和初始大小(以字节为单位)。 此值必须是 1024 的倍数,并且大于 1MB
。 附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示吉字节。 以下示例显示了如何使用各种单位将分配的内存大小设置为 6MB
-Xms6291456
-Xms6144k
-Xms6m
如果您没有设置此选项,则初始大小将设置为分配给老年代和年轻代的大小之和。 可以使用 -Xmn
选项或 -XX:NewSize
选项设置年轻代堆的初始大小
-Xmx size
指定内存分配池的最大大小(以字节为单位)。 此值必须是 1024 的倍数,并且大于 2 MB。 附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示吉字节。 默认值是在运行时根据系统配置选择的。 对于服务器部署,-Xms
和 -Xmx
通常设置为相同的值。 以下示例显示了如何使用各种单位将分配的内存的最大允许大小设置为 80MB
-Xmx83886080
-Xmx81920k
-Xmx80m
-Xmx
选项等效于 -XX:MaxHeapSize
。
-Xnoclassgc
禁用类垃圾回收 (GC)。 这可以节省一些 GC 时间,从而缩短应用程序运行期间的中断时间。 当您在启动时指定 -Xnoclassgc
时,应用程序中的类对象在 GC 期间会保持不变,并且始终被视为活动对象。 这会导致更多内存被永久占用,如果使用不当,会导致内存不足异常。
-Xrs
减少 JVM 对操作系统信号的使用。 关闭钩子通过在关闭时运行用户清理代码(例如关闭数据库连接)来启用 Java 应用程序的有序关闭,即使 JVM 意外终止也是如此。
Linux 和 macOS
JVM 会捕获信号以实现意外终止的关闭钩子。 JVM 使用
SIGHUP
、SIGINT
和SIGTERM
来启动关闭钩子的运行。嵌入 JVM 的应用程序通常需要捕获信号(例如
SIGINT
或SIGTERM
),这会导致与 JVM 信号处理程序发生冲突。-Xrs
选项可用于解决此问题。 当使用-Xrs
时,JVM 不会更改SIGINT
、SIGTERM
、SIGHUP
和SIGQUIT
的信号掩码,也不会安装这些信号的信号处理程序。Windows
JVM 会监视控制台控制事件以实现意外终止的关闭钩子。 具体来说,JVM 会注册一个控制台控制处理程序,该处理程序会开始关闭钩子处理,并为
CTRL_C_EVENT
、CTRL_CLOSE_EVENT
、CTRL_LOGOFF_EVENT
和CTRL_SHUTDOWN_EVENT
返回TRUE
。JVM 使用类似的机制来实现为调试目的转储线程堆栈的功能。 JVM 使用
CTRL_BREAK_EVENT
来执行线程转储。如果 JVM 作为服务运行(例如,作为 Web 服务器的 servlet 引擎),则它可以接收
CTRL_LOGOFF_EVENT
,但它不应该启动关闭,因为操作系统实际上并没有终止进程。 为了避免此类可能的干扰,可以使用-Xrs
选项。 当使用-Xrs
选项时,JVM 不会安装控制台控制处理程序,这意味着它不会监视或处理CTRL_C_EVENT
、CTRL_CLOSE_EVENT
、CTRL_LOGOFF_EVENT
或CTRL_SHUTDOWN_EVENT
。
指定 -Xrs
有两个后果
- Linux 和 macOS:
SIGQUIT
线程转储不可用。 - Windows: Ctrl + Break 线程转储不可用。
用户代码负责导致关闭钩子运行,例如,当 JVM 要终止时,调用 System.exit()。
-Xshare:mode
设置类数据共享 (CDS) 模式。
此选项的可能模式参数包括以下内容
auto
如果可能,使用 CDS。 这是 Java HotSpot 32 位 Client VM 的默认值。
on
要求使用 CDS。 如果无法使用类数据共享,此选项会打印错误消息并退出。
off
指示不要使用 CDS。
-XshowSettings
显示所有设置,然后继续。
-XshowSettings:category
显示设置并继续。 此选项的可能类别参数包括以下内容
all
显示所有类别的设置。 这是默认值。
locale
显示与区域设置相关的设置。
properties
显示与系统属性相关的设置。
vm
显示 JVM 的设置。
system
Linux:显示主机系统或容器配置并继续。
-Xss size
设置线程堆栈大小(以字节为单位)。 附加字母 k
或 K
表示 KB
,m
或 M
表示 MB
,g
或 G
表示 GB
。 默认值取决于平台
- Linux/x64(64 位):1024 KB
- macOS(64 位):1024 KB
- Windows:默认值取决于虚拟内存
以下示例将线程堆栈大小设置为 1024 KB,使用不同的单位
-Xss1m
-Xss1024k
-Xss1048576
此选项类似于 -XX:ThreadStackSize
。
-Xverify
设置字节码验证器的模式。
--add-reads module=target-module(,target-module)*
更新模块以读取目标模块,而不管模块声明如何。 target-module 可以是所有未命名的模块,以读取所有未命名的模块。
--add-exports module/package=target-module(,target-module)*
更新模块以将包导出到目标模块,而不管模块声明如何。 target-module 可以是所有未命名的模块,以导出到所有未命名的模块。
--add-opens module/package=target-module(,target-module)*
更新模块以将包打开到目标模块,而不管模块声明如何。
--illegal-access=parameter
运行时,--illegal-access=
接受一个关键字参数来指定操作模式。
- permit:此模式将运行时映像中每个模块中的每个包打开,以供所有未命名模块(例如类路径上的代码)中的代码访问,前提是该包存在于 JDK 8 中。这允许静态访问(例如,通过编译的字节码),以及通过平台的各种反射 API 进行深度反射访问。对任何此类包的第一个反射访问操作将导致发出警告。但是,在第一次出现之后不会发出警告。此单个警告描述了如何启用更多警告。此模式是当前 JDK 的默认模式,但在将来的版本中将更改。
- warn:此模式与 permit 相同,只是每次进行非法反射访问操作时都会发出警告消息。
- debug:此模式与 warn 相同,只是每次进行非法反射访问操作时都会发出警告消息和堆栈跟踪。
- deny:此模式禁用所有非法访问操作,除了由其他命令行选项(例如 --add-opens)启用的操作。此模式将在将来的版本中成为默认模式。
默认模式 --illegal-access=permit
旨在让您至少了解一次反射访问任何 JDK 内部 API 的类路径上的代码。要了解所有此类访问,您可以使用 warn 或 debug 模式。对于类路径上需要非法访问的每个库或框架,您有两个选择。
- 如果组件的维护者已经发布了不再使用 JDK 内部 API 的修复版本,那么您可以考虑升级到该版本。
- 如果组件仍然需要修复,那么您可以联系其维护者并要求他们用适当的导出 API 替换他们对 JDK 内部 API 的使用。
如果您必须继续使用需要非法访问的组件,那么您可以使用一个或多个 --add-opens
选项来打开仅那些需要访问的内部包,从而消除警告消息。
要验证您的应用程序是否已准备好用于 JDK 的未来版本,请使用 --illegal-access=deny
以及任何必要的 --add-opens
选项运行它。任何剩余的非法访问错误很可能是由于编译代码对 JDK 内部 API 的静态引用造成的。您可以通过使用 --jdk-internals
选项运行 jdeps 工具来识别这些引用。出于性能原因,当前 JDK 不会对非法静态访问操作发出警告。
--limit-modules module[,module...]
指定可观察模块宇宙的限制。
--patch-module module=file(;file)*
使用 JAR 文件或目录中的类和资源覆盖或增强模块。
--disable-@files
可在命令行的任何位置使用,包括在参数文件中,以防止进一步的 @filename
扩展。此选项在选项之后停止扩展 @-argfiles
。
--source version
在源文件模式下设置源的版本。
MacOS 的额外选项
以下额外选项是 macOS 特定的。
-XstartOnFirstThread
在第一个(AppKit)线程上运行 main() 方法。
-Xdock:name=application_name
覆盖停靠栏中显示的默认应用程序名称。
-Xdock:icon=path_to_icon_file
覆盖停靠栏中显示的默认图标。
高级运行时选项
这些 java 选项控制 Java HotSpot VM 的运行时行为。
-XX:ActiveProcessorCount=x
覆盖 VM 将用于计算其将用于各种操作(如垃圾收集和 ForkJoinPool)的线程池大小的 CPU 数量。
VM 通常从操作系统确定可用处理器的数量。此标志在 Docker 容器中运行多个 Java 进程时用于划分 CPU 资源。即使未启用 UseContainerSupport,此标志也会被遵守。有关启用和禁用容器支持的说明,请参阅 -XX:-UseContainerSupport
。
--XX:AllocateHeapAt=path
接受一个文件系统路径,并使用内存映射在内存设备上分配对象堆。使用此选项使 HotSpot VM 能够在用户指定的备用内存设备(例如 NV-DIMM
)上分配 Java 对象堆。
具有与 DRAM 相同语义的备用内存设备(包括原子操作的语义)可以用于对象堆,而无需更改现有应用程序代码。所有其他内存结构(如代码堆、元空间和线程堆栈)继续驻留在 DRAM 中。
一些操作系统通过文件系统公开非 DRAM 内存。这些文件系统中的内存映射文件绕过页面缓存,并提供虚拟内存到设备上物理内存的直接映射。现有的与堆相关的标志(如 -Xmx 和 -Xms)以及与垃圾收集相关的标志继续像以前一样工作。
-XX:-CompactStrings
禁用 Compact Strings 功能。默认情况下,此选项已启用。启用此选项后,仅包含单字节字符的 Java 字符串在内部表示和存储为使用 ISO-8859-1
/ Latin-1
编码的单字节/字符字符串。这将仅包含单字节字符的字符串所需的空间减少了 50%。对于包含至少一个多字节字符的 Java 字符串:这些字符串使用 UTF-16 编码表示和存储为每个字符 2 个字节。禁用 Compact Strings 功能会强制使用 UTF-16 编码作为所有 Java 字符串的内部表示。
禁用 Compact Strings 可能有益的情况包括以下情况
- 当已知应用程序将压倒性地分配多字节字符字符串时
- 在从 Java SE 8 迁移到 Java SE 9 或更高版本时观察到性能下降的意外事件中,并且分析表明 Compact Strings 引入了回归
在这两种情况下,禁用 Compact Strings 都是有意义的。
-XX:CompilerDirectivesFile=file
在程序启动时将来自文件的指令添加到指令堆栈。请参阅编译器指令和命令行。
-XX:CompilerDirectivesPrint
在程序启动时或添加新指令时打印指令堆栈。
-XX:ConcGCThreads=n
设置并行标记线程的数量。将 n
设置为并行垃圾收集线程(ParallelGCThreads
)数量的大约 1/4
。
-XX:+DisableAttachMechanism
禁用允许工具附加到 JVM 的机制。默认情况下,此选项已禁用,这意味着附加机制已启用,您可以使用诊断和故障排除工具,例如 jcmd
、jstack
、jmap
和 jinfo
。
-XX:ErrorFile=filename
指定在发生不可恢复错误时写入错误数据的路径和文件名。默认情况下,此文件在当前工作目录中创建,并命名为 hs_err_pidpid.log
,其中 pid 是导致错误的进程的标识符。
以下示例显示了如何设置默认日志文件(请注意,进程的标识符指定为 %p
)
-XX:ErrorFile=./hs_err_pid%p.log
- Linux 和 macOS:以下示例显示了如何将错误日志设置为
/var/log/java/java_error.log
:```shell - XX:ErrorFile=/var/log/java/java_error.log ```
- Windows:以下示例显示了如何将错误日志文件设置为
C:/log/java/java_error.log
:```shell - XX:ErrorFile=C:/log/java/java_error.log ```
如果无法在指定的目录中创建文件(由于空间不足、权限问题或其他问题),则文件将在操作系统的临时目录中创建。
- Linux 和 macOS:临时目录是
/tmp
。 - Windows:临时目录由 TMP 环境变量的值指定。如果该环境变量未定义,则使用 TEMP 环境变量的值。
-XX:+ExtensiveErrorReports
启用在 ErrorFile 中报告更广泛的错误信息。此选项可以在需要最大信息的环境中打开,即使生成的日志可能非常大,或者可能包含被认为敏感的信息。信息可能因版本而异,并且在不同的平台上也不同。默认情况下,此选项已禁用。
-XX:+FailOverToOldVerifier
在新的类型检查器失败时启用自动回退到旧的验证器。默认情况下,此选项已禁用,并且对于具有最新字节码版本的类,它会被忽略(即被视为已禁用)。您可以为具有旧版本字节码的类启用它。
-XX:+FlightRecorder
启用在应用程序运行时使用 Java Flight Recorder (JFR)。
-XX:FlightRecorderOptions=parameter=value 设置控制 JFR 行为的参数。
以下列表包含可用的 JFR parameter=value 条目
allow_threadbuffers_to_disk={true|false}
指定如果缓冲线程被阻塞,是否将线程缓冲区直接写入磁盘。默认情况下,此参数已禁用。
globalbuffersize=size
指定用于数据保留的总主内存量。默认值基于为 memorysize 指定的值。更改 memorysize 参数以更改全局缓冲区的大小。
maxchunksize=size
指定录制中数据块的最大大小(以字节为单位)。附加 m 或 M 以指定以兆字节 (MB) 为单位的大小,附加 g 或 G 以指定以千兆字节 (GB) 为单位的大小。默认情况下,数据块的最大大小设置为 12 MB。允许的最小值为 1 MB。
memorysize=size
确定应使用多少缓冲区内存,并根据指定的大小设置 globalbuffersize
和 numglobalbuffers
参数。附加 m 或 M 以指定以兆字节 (MB) 为单位的大小,附加 g 或 G 以指定以千兆字节 (GB) 为单位的大小。默认情况下,内存大小设置为 10 MB。
numglobalbuffers
指定使用的全局缓冲区数量。默认值基于指定的内存大小。更改 memorysize
参数以更改全局缓冲区的数量。
old-object-queue-size=number-of-objects
要跟踪的旧对象的最大数量。默认情况下,对象数量设置为 256。
repository=path
指定用于临时磁盘存储的存储库(目录)。默认情况下,使用系统的临时目录。
retransform={true|false}
指定是否应使用 JVMTI 重新转换事件类。如果为 false,则在加载事件类时添加检测。默认情况下,此参数已启用。
samplethreads={true|false}
指定是否启用线程采样。只有在启用采样事件以及此参数时,才会发生线程采样。默认情况下,此参数已启用。
stackdepth=depth
堆栈跟踪的堆栈深度。默认情况下,深度设置为 64 个方法调用。最大值为 2048。大于 64 的值可能会产生重大开销并降低性能。
threadbuffersize=size
指定每个线程本地缓冲区的大小(以字节为单位)。默认情况下,本地缓冲区大小设置为 8 千字节。覆盖此参数可能会降低性能,不建议这样做。
您可以通过逗号分隔多个参数的值来指定它们。
-XX:InitiatingHeapOccupancyPercent=n
设置触发标记周期的 Java 堆占用率阈值。默认占用率为整个 Java 堆的 45%。
-XX:LargePageSizeInBytes=size
Linux 和 macOS:设置用于 Java 堆的大页面的最大大小(以字节为单位)。size 参数必须是 2 的幂(2、4、8、16 等)。附加字母 k 或 K 以表示千字节,m 或 M 以表示兆字节,g 或 G 以表示千兆字节。默认情况下,大小设置为 0,这意味着 JVM 会自动选择大页面的大小。
以下示例描述了如何将大页面大小设置为 4 兆字节 (MB)
-XX:LargePageSizeInBytes=4m
-XX:MaxDirectMemorySize=size
设置 java.nio 包的直接缓冲区分配的最大总大小(以字节为单位)。附加字母 k 或 K 以表示千字节,m 或 M 以表示兆字节,g 或 G 以表示千兆字节。默认情况下,大小设置为 0,这意味着 JVM 会自动选择 NIO 直接缓冲区分配的大小。
以下示例说明了如何以不同的单位将 NIO 大小设置为 1024 KB
-XX:MaxDirectMemorySize=1m
-XX:MaxDirectMemorySize=1024k
-XX:MaxDirectMemorySize=1048576
-XX:-MaxFDLimit
禁用尝试将打开的文件描述符数量的软限制设置为硬限制。默认情况下,此选项在所有平台上都已启用,但在 Windows 上会被忽略。您可能需要禁用的唯一时间是在 Mac OS 上,因为它的使用会将最大值限制为 10240,这低于实际的系统最大值。
-XX:MaxGCPauseMillis=ms
设置所需最大暂停时间的目标值。默认值为 200 毫秒。指定的值不会适应您的堆大小。
-XX:NativeMemoryTracking=mode
指定跟踪 JVM 本机内存使用情况的模式。此选项的可能模式参数包括以下内容
off
指示不跟踪 JVM 本机内存使用情况。如果您没有指定 -XX:NativeMemoryTracking 选项,这是默认行为。
summary
仅跟踪 JVM 子系统(如 Java 堆、类、代码和线程)的内存使用情况。
detail
除了跟踪 JVM 子系统的内存使用情况外,还跟踪各个 CallSite、各个虚拟内存区域及其已提交区域的内存使用情况。
-XX:ObjectAlignmentInBytes=alignment
设置 Java 对象的内存对齐方式(以字节为单位)。默认情况下,该值为 8 字节。指定的值应为 2 的幂,并且必须在 8 和 256(含)的范围内。此选项使使用压缩指针和大型 Java 堆大小成为可能。
堆大小限制(以字节为单位)计算如下
4GB * ObjectAlignmentInBytes
-XX:OnError=string
设置在发生不可恢复错误时运行的自定义命令或一系列用分号分隔的命令。如果字符串包含空格,则必须将其括在引号中。
- Linux 和 macOS:以下示例显示了如何使用
-XX:OnError
选项运行gcore
命令以创建核心映像,并在发生不可恢复错误时启动调试器以附加到进程(%p
表示当前进程)
-XX:OnError="gcore %p;dbx - %p"
- Windows:以下示例显示了如何使用 -XX:OnError 选项运行
userdump.exe
实用程序以在发生不可恢复错误时获取崩溃转储(%p
表示当前进程)。此示例假设userdump.exe
实用程序的路径在 PATH 环境变量中指定:```shell - XX:OnError="userdump.exe %p" ```
-XX:OnOutOfMemoryError=string
设置在首次抛出 OutOfMemoryError 异常时运行的自定义命令或一系列用分号分隔的命令。如果字符串包含空格,则必须将其括在引号中。有关命令字符串的示例,请参阅 -XX:OnError
选项的描述。
-XX:ParallelGCThreads=n
设置 STW 工作线程的值。将 n 的值设置为逻辑处理器的数量。n 的值与逻辑处理器的数量相同,直到值为 8。如果逻辑处理器超过 8 个,则此选项将 n 的值设置为逻辑处理器的约 5/8。这在大多数情况下都有效,但对于较大的 SPARC 系统,n 的值可能约为逻辑处理器的 5/16。
-XX:+PerfDataSaveToFile
如果启用,则在 Java 应用程序退出时保存 jstat 二进制数据。此二进制数据保存在名为 hsperfdata_pid
的文件中,其中 pid 是您运行的 Java 应用程序的进程标识符。使用 jstat
命令显示此文件中包含的性能数据,如下所示
jstat -class file:///path/hsperfdata_pid
jstat -gc file:///path/hsperfdata_pid
-XX:+PrintCommandLineFlags
启用打印出现在命令行上的符合人体工程学选择的 JVM 标志。了解 JVM 设置的人体工程学值(如堆空间大小和所选垃圾收集器)可能很有用。默认情况下,此选项已禁用,并且不会打印标志。
-XX:+PreserveFramePointer
在使用 RBP 寄存器作为通用寄存器 (-XX:-PreserveFramePointer
) 和使用 RBP 寄存器保存当前执行方法的帧指针 (-XX:+PreserveFramePointer
) 之间进行选择。如果帧指针可用,则外部分析工具(例如 Linux perf)可以构建更准确的堆栈跟踪。
-XX:+PrintNMTStatistics
在启用本机内存跟踪时(请参阅 -XX:NativeMemoryTracking
),启用在 JVM 退出时打印收集的本机内存跟踪数据。默认情况下,此选项已禁用,并且不会打印本机内存跟踪数据。
-XX:+RelaxAccessControlCheck
减少验证器中的访问控制检查量。默认情况下,此选项已禁用,并且对于具有最新字节码版本的类,它会被忽略(即被视为已禁用)。您可以为具有旧版本字节码的类启用它。
-XX:SharedArchiveFile=path
指定类数据共享 (CDS) 存档文件的路径和名称
-XX:SharedArchiveConfigFile=shared_config_file
指定添加到存档文件的其他共享数据。
-XX:SharedClassListFile=file_name
指定包含要存储在类数据共享 (CDS) 存档中的类的名称的文本文件。此文件包含每行一个类的完整名称,但斜杠 (/) 替换点 (.)。例如,要指定类 java.lang.Object
和 hello.Main
,请创建一个包含以下两行的文本文件
java/lang/Object
hello/Main
您在此文本文件中指定的类应包括应用程序常用的类。它们可能包括来自应用程序、扩展或引导类路径的任何类。
-XX:+ShowMessageBoxOnError
启用在 JVM 遇到不可恢复错误时显示对话框。这将阻止 JVM 退出并使进程保持活动状态,以便您可以附加调试器以调查错误原因。默认情况下,此选项已禁用。
-XX:StartFlightRecording=parameter=value
启动 Java 应用程序的 JFR 录制。此选项等效于 JFR.start 诊断命令,该命令在运行时启动录制。在启动 JFR 录制时,您可以设置以下 parameter=value 条目
delay=time
指定 Java 应用程序启动时间与录制开始之间的延迟。附加 s 以指定以秒为单位的时间,m 以指定以分钟为单位的时间,h 以指定以小时为单位的时间,d 以指定以天为单位的时间。例如,指定 10m 表示 10 分钟。默认情况下,没有延迟,此参数设置为 0。
disk={true|false}
指定是否在录制时将数据写入磁盘。默认情况下,此参数已启用。
dumponexit={true|false}
指定 JVM 关闭时是否转储正在运行的录制。如果启用并且没有输入文件名,则录制将写入进程启动的目录中的文件。文件名是系统生成的名称,包含进程 ID、录制 ID 和当前时间戳,类似于 hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr。默认情况下,此参数已禁用。
duration=time
指定录制的持续时间。附加 s 以指定以秒为单位的时间,m 以指定以分钟为单位的时间,h 以指定以小时为单位的时间,d 以指定以天为单位的时间。例如,指定 5h 表示 5 小时。默认情况下,持续时间没有限制,此参数设置为 0。
filename=path
指定停止录制时将录制写入的文件的路径和名称,例如
recording.jfr
/home/user/recordings/recording.jfr
c:\recordings\recording.jfr
name=identifier
接受录制的名称和标识符。
maxage=time
指定要为录制保留的磁盘数据的最大年龄。此参数仅在 disk 参数设置为 true 时有效。附加 s 以指定以秒为单位的时间,m 以指定以分钟为单位的时间,h 以指定以小时为单位的时间,d 以指定以天为单位的时间。例如,指定 30s 表示 30 秒。默认情况下,最大年龄没有限制,此参数设置为 0s。
maxsize=size
指定要为录制保留的磁盘数据的最大大小(以字节为单位)。此参数仅在 disk 参数设置为 true 时有效。该值不得小于使用 -XX:FlightRecorderOptions
设置的 maxchunksize
参数的值。附加 m 或 M 以指定以兆字节为单位的大小,附加 g 或 G 以指定以千兆字节 (GB) 为单位的大小。默认情况下,磁盘数据的最大大小没有限制,此参数设置为 0。
path-to-gc-roots={true|false}
指定是否在录制结束时收集到垃圾收集 (GC) 根的路径。默认情况下,此参数已禁用。
到 GC 根的路径对于查找内存泄漏很有用,但收集它很耗时。仅在您启动要怀疑存在内存泄漏的应用程序的录制时启用此选项。如果 settings 参数设置为 profile,则将包含潜在泄漏对象分配位置的堆栈跟踪信息。
settings=path
指定事件设置文件(JFC 类型)的路径和名称。默认情况下,使用 default.jfc
文件,该文件位于 JRE_HOME/lib/jfr
中。此默认设置文件以低开销收集一组预定义的信息,因此对性能的影响最小,可以与持续运行的录制一起使用。
还提供了一个名为 profile.jfc
的第二个设置文件,它提供比默认配置更多的数据,但开销更大,会影响性能。在需要更多信息时,将此配置用于短时间段。
您可以通过逗号分隔多个参数的值来指定它们。
-XX:ThreadStackSize=size
设置 Java 线程堆栈大小(以千字节为单位)。使用缩放后缀(例如 k
)会导致千字节值的缩放,因此 -XX:ThreadStackSize=1k
将 Java 线程堆栈大小设置为 1024*1024
字节或 1
兆字节。默认值取决于平台。
- Linux:1024 KB
- macOS:1024 KB
- Windows:默认值取决于虚拟内存。
以下示例显示了如何在不同的单位中将线程堆栈大小设置为 1 兆字节。
-XX:ThreadStackSize=1k
-XX:ThreadStackSize=1024
此选项类似于 -Xss
。
-XX:-UseBiasedLocking
禁用使用偏向锁。一些具有大量无竞争同步的应用程序在启用此标志后可能会获得显著的加速,但具有某些锁定模式的应用程序可能会看到速度下降。
默认情况下,此选项已启用。
-XX:-UseCompressedOops
禁用使用压缩指针。默认情况下,此选项已启用,并且在 Java 堆大小小于 32 GB 时使用压缩指针。启用此选项时,对象引用将表示为 32 位偏移量而不是 64 位指针,这通常在使用小于 32 GB 的 Java 堆大小运行应用程序时提高性能。此选项仅适用于 64 位 JVM。
当 Java 堆大小大于 32 GB 时,也可以使用压缩指针。请参阅 -XX:ObjectAlignmentInBytes
选项。
-XX:-UseContainerSupport
VM 现在提供自动容器检测支持,允许 VM 确定在 docker 容器中运行的 Java 进程可用的内存量和处理器数量。它使用此信息来分配系统资源。此支持仅在 Linux x64 平台上可用。如果支持,此标志的默认值为 true,并且默认情况下启用容器支持。可以使用 -XX:-UseContainerSupport
禁用它。
统一日志记录可用于帮助诊断与此支持相关的问题。
使用 -Xlog:os+container=trace
以获取容器信息的最高级别日志记录。请参阅使用 JVM 统一日志记录框架启用日志记录,以了解使用统一日志记录的说明。
-XX:+UseGCLogRotation
处理大型日志文件。此选项必须与 -Xloggc:filename
一起使用。
-XX:NumberOfGClogFiles=number_of_files
处理大型日志文件。number_of_files
必须大于或等于 1
。默认值为 1
。
-XX:GCLogFileSize=number
处理大型日志文件。number
可以是 numberM
或 numberK
的形式。默认设置为 512K
。
-XX:+UseHugeTLBFS
仅限 Linux:此选项等效于指定 -XX:+UseLargePages
。此选项默认情况下处于禁用状态。此选项在预留内存时预先分配所有大页面;因此,JVM 无法动态增长或缩小大页面内存区域。如果您想要此行为,请参阅 -XX:UseTransparentHugePages
。
-XX:+UseLargePages
启用使用大页面内存。默认情况下,此选项处于禁用状态,并且不使用大页面内存。
-XX:+UseMembar
启用在线程状态转换时发出成员。此选项默认情况下在所有平台上都处于禁用状态,除了 ARM 服务器,在 ARM 服务器上它处于启用状态。(建议您不要在 ARM 服务器上禁用此选项。)
-XX:+UsePerfData
启用 perfdata 功能。默认情况下,此选项已启用,以允许 JVM 监控和性能测试。禁用它会抑制 hsperfdata_userid
目录的创建。要禁用 perfdata 功能,请指定 -XX:-UsePerfData
。
-XX:+UseTransparentHugePages
仅限 Linux:启用使用可以动态增长或缩小的大页面。此选项默认情况下处于禁用状态。您可能会遇到透明大页面的性能问题,因为操作系统会移动其他页面以创建大页面;此选项是为了实验而提供的。
-XX:+AllowUserSignalHandlers
启用应用程序安装信号处理程序。默认情况下,此选项处于禁用状态,并且不允许应用程序安装信号处理程序。
-XX:VMOptionsFile=filename
允许用户在文件中指定 VM 选项,例如
java -XX:VMOptionsFile=/var/my_vm_options HelloWorld
高级 JIT 编译器选项
这些 java 选项控制 Java HotSpot VM 执行的动态即时 (JIT) 编译。
-XX:AllocateInstancePrefetchLines=lines
设置在实例分配指针之前预取的行数。默认情况下,预取的行数设置为 1。
-XX:AllocateInstancePrefetchLines=1
设置在实例分配指针之前预取的行数。默认情况下,预取的行数设置为 1。
-XX:AllocateInstancePrefetchLines=1
只有 Java HotSpot Server VM 支持此选项。
-XX:AllocatePrefetchDistance=size
设置对象分配的预取距离的大小(以字节为单位)。从最后一个分配对象的地址开始,预取将要使用新对象的值写入的内存,直到此距离。每个 Java 线程都有自己的分配点。
负值表示预取距离是根据平台选择的。正值是预取的字节数。附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示千兆字节。默认值为 -1
。
以下示例显示了如何将预取距离设置为 1024 字节。
-XX:AllocatePrefetchDistance=1024
只有 Java HotSpot Server VM 支持此选项。
-XX:AllocatePrefetchInstr=instruction
设置预取指令,以便在分配指针之前预取。只有 Java HotSpot Server VM 支持此选项。可能的值从 0
到 3
。值背后的实际指令取决于平台。默认情况下,预取指令设置为 0
。
-XX:AllocatePrefetchInstr=0
只有 Java HotSpot Server VM 支持此选项。
-XX:AllocatePrefetchLines=lines
设置要加载的缓存行数,方法是使用在已编译代码中生成的预取指令,在最后一次对象分配之后加载。如果最后分配的对象是实例,则默认值为 1,如果它是数组,则默认值为 3。
以下示例显示了如何将加载的缓存行数设置为 5。
-XX:AllocatePrefetchLines=5
只有 Java HotSpot Server VM 支持此选项。
-XX:AllocatePrefetchStyle=style
设置预取指令的生成代码样式。style
参数是 0 到 3 之间的整数。
0
不生成预取指令。
1
在每次分配后执行预取指令。这是默认参数。
2
使用线程本地分配块 (TLAB) 水印指针来确定何时执行预取指令。
3
在 SPARC 上使用 BIS 指令进行分配预取。
只有 Java HotSpot Server VM 支持此选项。
-XX:+BackgroundCompilation
启用后台编译。此选项默认情况下已启用。要禁用后台编译,请指定 -XX:-BackgroundCompilation
(这等效于指定 -Xbatch
)。
-XX:CICompilerCount=threads
设置用于编译的编译器线程数。默认情况下,线程数对于服务器 JVM 设置为 2,对于客户端 JVM 设置为 1
,如果使用分层编译,则会扩展到核心数。以下示例显示了如何将线程数设置为 2
。
-XX:CICompilerCount=2
-XX:CompileCommand=command,method[,option]
指定要对方法执行的命令。例如,要排除 String 类的 indexOf()
方法被编译,请使用以下命令
-XX:CompileCommand=exclude,java/lang/String.indexOf
如果方法在没有签名的情况下指定,则该命令将应用于具有指定名称的所有方法。但是,您也可以在类文件格式中指定方法的签名。在这种情况下,您应该将参数括在引号中,否则 shell 会将分号视为命令结束。例如,如果您只想排除 String 类的 indexOf(String)
方法被编译,请使用以下命令
-XX:CompileCommand="exclude,java/lang/String.indexOf,(Ljava/lang/String;)I"
您还可以使用星号 (*
) 作为类和方法名称的通配符。例如,要排除所有类中的所有 indexOf()
方法被编译,请使用以下命令
-XX:CompileCommand=exclude,*.indexOf
逗号和句点是空格的别名,这使得通过 shell 传递编译器命令变得更容易。您可以通过在引号中包含参数来使用空格作为分隔符将参数传递给 -XX:CompileCommand
-XX:CompileCommand="exclude java/lang/String indexOf"
请注意,在使用 -XX:CompileCommand
选项解析命令行上传递的命令后,JIT 编译器会从 .hotspot_compiler
文件中读取命令。您可以向此文件添加命令,或者使用 -XX:CompileCommandFile
选项指定不同的文件。
要添加多个命令,可以多次指定 -XX:CompileCommand 选项,或者用换行符 (\n
) 分隔每个参数。以下命令可用
break
在调试 JVM 时设置断点,以便在编译指定方法的开头停止。
compileonly
除指定方法外,排除所有方法的编译。或者,可以使用 -XX:CompileOnly
选项,它允许您指定多个方法。
dontinline
阻止内联指定方法。
exclude
从编译中排除指定方法。
help
打印 -XX:CompileCommand
选项的帮助信息。
inline
尝试内联指定方法。
log
除指定方法外,排除所有方法的编译日志记录(使用 -XX:+LogCompilation 选项)。默认情况下,会对所有已编译方法执行日志记录。
option
将 JIT 编译选项传递给指定方法,以代替最后一个参数(选项)。编译选项在方法名称之后设置。例如,要为 StringBuffer
类的 append()
方法启用 BlockLayoutByFrequency 选项,请使用以下命令
-XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency
您可以指定多个编译选项,用逗号或空格分隔。
print
打印指定方法编译后的生成汇编代码。
quiet
指示不要打印编译命令。默认情况下,使用 -XX:CompileCommand
选项指定的命令将被打印。例如,如果您从编译中排除 String 类的 indexOf()
方法,则会将以下内容打印到标准输出
CompilerOracle: exclude java/lang/String.indexOf
您可以通过在其他 -XX:CompileCommand
选项之前指定 -XX:CompileCommand=quiet
选项来抑制此行为。
-XX:CompileCommandFile=filename
设置从 JIT 编译器读取命令的文件。默认情况下,.hotspot_compiler
文件用于存储 JIT 编译器执行的命令。
命令文件中的每一行代表一个命令、一个类名和一个方法名,该命令用于该方法。例如,此行将为 String 类的 toString()
方法打印汇编代码
print java/lang/String toString
如果您使用 JIT 编译器命令对方法执行操作,请参阅 -XX:CompileCommand 选项。
-XX:CompileOnly=methods
设置应限制编译的方法列表(用逗号分隔)。仅编译指定的方法。使用完整类名(包括包和子包)指定每个方法。例如,要仅编译 String 类的 length() 方法和 List 类的 size()
方法,请使用以下命令
-XX:CompileOnly=java/lang/String.length,java/util/List.size
请注意,指定了完整类名,包括所有用斜杠 (/
) 分隔的包和子包。为了便于剪切和粘贴操作,还可以使用 -XX:+PrintCompilation
和 -XX:+LogCompilation
选项生成的格式。
-XX:CompileOnly=java.lang.String::length,java.util.List::size
请注意,指定了完整类名,包括所有用斜杠 (/) 分隔的包和子包。为了便于剪切和粘贴操作,还可以使用 -XX:+PrintCompilation
和 -XX:+LogCompilation
选项生成的格式。
-XX:CompileOnly=java.lang.String::length,java.util.List::size
虽然不支持通配符,但您可以仅指定类名或包名来编译该类或包中的所有方法,也可以仅指定方法名来编译任何类中具有此名称的方法。
-XX:CompileOnly=java/lang/String
-XX:CompileOnly=java/lang
-XX:CompileOnly=.length
-XX:CompileThreshold=invocations
设置编译前解释方法调用的次数。默认情况下,在服务器 JVM 中,JIT 编译器执行 10,000 次解释方法调用以收集信息以进行高效编译。对于客户端 JVM,默认设置为 1,500 次调用。启用分层编译时,此选项将被忽略。请参阅选项 -XX:-TieredCompilation
。以下示例显示如何将解释方法调用的次数设置为 5,000
-XX:CompileThreshold=5000
您可以通过指定 -Xcomp 选项来完全禁用编译前对 Java 方法的解释。
-XX:CompileThresholdScaling=scale
提供对首次编译的统一控制。此选项控制在分层和 nontiered
操作模式下何时首次编译方法。CompileThresholdScaling
选项的整数值介于 0 和 +Inf 之间,并按比例缩放与当前操作模式(分层和 nontiered
)相对应的阈值。将 CompileThresholdScaling
设置为小于 1.0
的值会导致更早的编译,而大于 1.0 的值会导致更晚的编译。将 CompileThresholdScaling 设置为 0 等效于禁用编译。
-XX:+DoEscapeAnalysis
启用逃逸分析的使用。此选项默认启用。要禁用逃逸分析的使用,请指定 -XX:-DoEscapeAnalysis
。只有 Java HotSpot Server VM 支持此选项。
-XX:InitialCodeCacheSize=size
设置初始代码缓存大小(以字节为单位)。附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示吉字节。默认值为 500 KB
。初始代码缓存大小不应小于系统的最小内存页大小。以下示例显示如何将初始代码缓存大小设置为 32 KB
-XX:InitialCodeCacheSize=32k
-XX:+Inline
启用方法内联。此选项默认启用,以提高性能。要禁用方法内联,请指定 -XX:-Inline
。
-XX:InlineSmallCode=size
设置应内联的已编译方法的最大代码大小(以字节为单位)。附加字母 k 或 K 表示千字节,m 或 M 表示兆字节,g
或 G
表示吉字节。只有代码大小小于指定大小的已编译方法才会被内联。默认情况下,最大代码大小设置为 1000 字节。
-XX:InlineSmallCode=1000
-XX:+LogCompilation
启用将编译活动记录到当前工作目录中名为 hotspot.log
的文件。您可以使用 -XX:LogFile
选项指定不同的日志文件路径和名称。
默认情况下,此选项被禁用,并且不会记录编译活动。-XX:+LogCompilation
选项必须与 -XX:UnlockDiagnosticVMOptions
选项一起使用,该选项会解锁诊断 JVM 选项。
您可以使用 -XX:+PrintCompilation
选项启用详细的诊断输出,并在每次编译方法时向控制台打印一条消息。
-XX:MaxInlineSize=size
设置要内联的方法的最大字节码大小(以字节为单位)。附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示吉字节。默认情况下,最大字节码大小设置为 35 字节。
-XX:MaxInlineSize=35
-XX:MaxNodeLimit=nodes
设置在单方法编译期间使用的最大节点数。默认情况下,最大节点数设置为 65,000。
-XX:MaxNodeLimit=65000
-XX:NonNMethodCodeHeapSize=size
设置包含非方法代码的代码段的大小(以字节为单位)。
包含非方法代码的非方法代码段,例如编译器缓冲区和字节码解释器。此代码类型永远保留在代码缓存中。仅当启用 —XX:SegmentedCodeCache
时,才会使用此标志。
—XX:NonProfiledCodeHeapSize=size
设置包含 nonprofiled
方法的代码段的大小(以字节为单位)。仅当启用 —XX:SegmentedCodeCache
时,才会使用此标志。
-XX:MaxTrivialSize=size
设置要内联的琐碎方法的最大字节码大小(以字节为单位)。附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示吉字节。默认情况下,琐碎方法的最大字节码大小设置为 6 字节。
-XX:MaxTrivialSize=6
-XX:+OptimizeStringConcat
启用对字符串连接操作的优化。此选项默认启用。要禁用对字符串连接操作的优化,请指定 -XX:-OptimizeStringConcat
。只有 Java HotSpot Server VM 支持此选项。
-XX:+PrintAssembly
启用使用外部 hsdis-
默认情况下,此选项被禁用,并且不会打印汇编代码。-XX:+PrintAssembly
选项必须与 -XX:UnlockDiagnosticVMOptions
选项一起使用,该选项会解锁诊断 JVM 选项。
-XX:ProfiledCodeHeapSize=size
设置包含已分析方法的代码段的大小(以字节为单位)。仅当启用 -XX:SegmentedCodeCache 时,才会使用此标志。
-XX:+PrintCompilation
启用 JVM 的详细诊断输出,并在每次编译方法时向控制台打印一条消息。这使您可以查看哪些方法实际上被编译了。默认情况下,此选项被禁用,并且不会打印诊断输出。
您还可以使用 -XX:+LogCompilation 选项将编译活动记录到文件中。
-XX:+PrintInlining
启用打印内联决策。这使您可以查看哪些方法正在被内联。
默认情况下,此选项被禁用,并且不会打印内联信息。-XX:+PrintInlining
选项必须与 -XX:+UnlockDiagnosticVMOptions
选项一起使用,该选项会解锁诊断 JVM 选项。
-XX:ReservedCodeCacheSize=size
设置 JIT 编译代码的最大代码缓存大小(以字节为单位)。附加字母 k
或 K
表示千字节,m
或 M
表示兆字节,g
或 G
表示吉字节。默认最大代码缓存大小为 240 MB,除非您使用选项 -XX:-TieredCompilation
禁用分层编译,在这种情况下,默认大小为 48 MB。此选项的限制为 2 GB;否则,将生成错误。最大代码缓存大小不应小于初始代码缓存大小。请参阅选项 -XX:InitialCodeCacheSize
。
-XX:RTMAbortRatio=abort_ratio
将 RTM 中止率指定为所有执行的 RTM 事务的百分比 (%
)。如果中止的事务数量超过此比率,则已编译代码将被反优化。启用 -XX:+UseRTMDeopt
选项时,将使用此比率。此选项的默认值为 50。这意味着如果 50%
的事务被中止,则已编译代码将被反优化。
-XX:+SegmentedCodeCache
启用代码缓存的分段。如果没有 -XX:+SegmentedCodeCache
,代码缓存将包含一个大的段。使用 -XX:+SegmentedCodeCache
,我们将为非方法、已分析方法和未分析方法代码创建单独的段。这些段在运行时不会调整大小。如果启用分层编译 (-XX:+TieredCompilation
) 并且 -XX:ReservedCodeCacheSize >= 240 MB
,则默认情况下会启用此功能。优点是更好地控制内存占用、减少代码碎片以及由于改进的局部性而导致更好的 iTLB/iCache 行为。iTLB/iCache
是一个特定于 CPU 的术语,表示指令转换查找旁路缓冲区 (ITLB)。ICache 是 CPU 中的指令缓存。代码缓存的实现可以在以下文件中找到:/share/vm/code/codeCache.cpp。
-XX:StartAggressiveSweepingAt=percent
当只有给定百分比的代码缓存可用时,强制对活动方法进行堆栈扫描以积极地删除未使用的代码。默认值为 10%。
-XX:RTMRetryCount=number_of_retries
指定在中止或繁忙时,RTM 锁定代码在回退到正常锁定机制之前重试的次数。此选项的默认值为 5。必须启用 -XX:UseRTMLocking
选项。
-XX:-TieredCompilation
禁用分层编译的使用。默认情况下,此选项启用。只有 Java HotSpot Server VM 支持此选项。
-XX:+UseAES
为 Intel、AMD 和 SPARC 硬件启用基于硬件的 AES 本征函数。支持的硬件包括 Intel Westmere(2010 年及以后)、AMD Bulldozer(2011 年及以后)和 SPARC(T4 及以后)。-XX:+UseAES
与 UseAESIntrinsics 一起使用。现在控制本征函数的标志需要选项 -XX:+UnlockDiagnosticVMOptions。
-XX:+UseAESIntrinsics
默认情况下启用 -XX:+UseAES 和 -XX:+UseAESIntrinsics 标志,并且仅在 Java HotSpot Server VM 中受支持。要禁用基于硬件的 AES 内在函数,请指定 -XX:-UseAES -XX:-UseAESIntrinsics
。例如,要启用硬件 AES,请使用以下标志
-XX:+UseAES -XX:+UseAESIntrinsics
现在控制内在函数的标志需要选项 -XX:+UnlockDiagnosticVMOptions
。要支持 UseAES 和 UseAESIntrinsics 标志,请使用 -server
选项选择 Java HotSpot Server VM。这些标志在 Client VM 上不受支持。
-XX:+UseCMoveUnconditionally
无论盈利能力分析如何,都会生成 CMove(标量和向量)指令。
-XX:+UseCodeCacheFlushing
在关闭编译器之前启用代码缓存的刷新。此选项默认情况下启用。要禁用在关闭编译器之前刷新代码缓存,请指定 -XX:-UseCodeCacheFlushing
。
-XX:+UseCondCardMark
在更新卡表之前启用检查卡是否已标记。此选项默认情况下禁用。它应该只在具有多个插槽的机器上使用,在那里它可以提高依赖于并发操作的 Java 应用程序的性能。只有 Java HotSpot Server VM 支持此选项。
-XX:+UseCountedLoopSafepoints
在计数循环中保留安全点。它的默认值为 false。
-XX:+UseFMA
在硬件支持 FMA 指令(例如,Intel、SPARC 和 ARM64)的硬件上启用基于硬件的 FMA 内在函数。FMA 内在函数是为计算 (a * b + c) 表达式的值的 java.lang.Math.fma(a, b, c) 方法生成的。
-XX:+UseRTMDeopt
根据中止率自动调整 RTM 锁定。此比率由 -XX:RTMAbortRatio 选项指定。如果中止的事务数量超过中止率,则包含锁的方法将被反优化并使用所有锁作为普通锁重新编译。此选项默认情况下禁用。必须启用 -XX:+UseRTMLocking 选项。
-XX:+UseRTMLocking
为所有膨胀的锁生成受限事务内存 (RTM) 锁定代码,并将普通锁定机制作为回退处理程序。此选项默认情况下禁用。与 RTM 相关的选项仅在支持事务同步扩展 (TSX) 的 x86 CPU 上的 Java HotSpot Server VM 中可用。
RTM 是英特尔 TSX 的一部分,TSX 是一个 x86
指令集扩展,它有助于创建多线程应用程序。RTM 引入了新的指令 XBEGIN
、XABORT
、XEND
和 XTEST
。XBEGIN
和 XEND
指令将一组指令括起来以作为事务运行。如果在运行事务时没有发现冲突,则内存和寄存器修改将在 XEND
指令处一起提交。XABORT
指令可用于显式中止事务,而 XEND 指令检查一组指令是否在事务中运行。
当另一个线程尝试访问同一事务时,事务上的锁会膨胀,从而阻塞未最初请求访问事务的线程。RTM 要求在事务中止或失败的情况下指定一组回退操作。RTM 锁是已委托给 TSX 系统的锁。
RTM 提高了在关键区域(不能被多个线程同时访问的代码)中具有低冲突的高度竞争锁的性能。RTM 还提高了粗粒度锁定的性能,粗粒度锁定通常在多线程应用程序中表现不佳。(粗粒度锁定是长时间持有锁以最大程度地减少获取和释放锁的开销的策略,而细粒度锁定是尝试通过仅在必要时锁定并在尽可能快地解锁来实现最大并行的策略。)此外,对于由不同线程使用的轻度竞争锁,RTM 可以减少错误的缓存行共享,也称为缓存行乒乓。当来自不同处理器的多个线程访问不同的资源时,但这些资源共享相同的缓存行,就会发生这种情况。结果,处理器反复使其他处理器的缓存行失效,这迫使它们从主内存而不是它们的缓存中读取。
-XX:+UseSHA
为 SPARC 硬件启用 SHA 加密哈希函数的基于硬件的内在函数。UseSHA 选项与 UseSHA1Intrinsics
、UseSHA256Intrinsics
和 UseSHA512Intrinsics
选项一起使用。
UseSHA 和 UseSHA*Intrinsics 标志默认情况下启用,并且仅在 SPARC T4 及更高版本上的 Java HotSpot Server VM 64 位中受支持。
此功能仅在使用 sun.security.provider.Sun 提供程序进行 SHA 操作时适用。现在控制内在函数的标志需要选项 -XX:+UnlockDiagnosticVMOptions
。
要禁用所有基于硬件的 SHA 内在函数,请指定 -XX:-UseSHA
。要仅禁用特定 SHA 内在函数,请使用相应的选项。例如:-XX:-UseSHA256Intrinsics
。
-XX:+UseSHA1Intrinsics
启用 SHA-1 加密哈希函数的内在函数。现在控制内在函数的标志需要选项 -XX:+UnlockDiagnosticVMOptions。
-XX:+UseSHA256Intrinsics
启用 SHA-224 和 SHA-256 加密哈希函数的内在函数。现在控制内在函数的标志需要选项 -XX:+UnlockDiagnosticVMOptions
。
-XX:+UseSHA512Intrinsics
启用 SHA-384 和 SHA-512 加密哈希函数的内在函数。现在控制内在函数的标志需要选项 -XX:+UnlockDiagnosticVMOptions
。
-XX:+UseSuperWord
启用将标量操作转换为超级字操作。超级字是一种矢量化优化。此选项默认情况下启用。要禁用将标量操作转换为超级字操作,请指定 -XX:-UseSuperWord
。只有 Java HotSpot Server VM 支持此选项。
高级可服务性选项
这些 java 选项提供了收集系统信息和执行广泛调试的能力。
-XX:+ExtendedDTraceProbes
Linux 和 macOS:启用影响性能的额外 dtrace 工具探针。默认情况下,此选项禁用,dtrace 仅执行标准探针。
-XX:+HeapDumpOnOutOfMemoryError
当抛出 java.lang.OutOfMemoryError
异常时,启用使用堆分析器 (HPROF) 将 Java 堆转储到当前目录中的文件。您可以使用 -XX:HeapDumpPath 选项显式设置堆转储文件路径和名称。默认情况下,此选项禁用,并且在抛出 OutOfMemoryError 异常时不会转储堆。
-XX:HeapDumpPath=path
设置在设置 -XX:+HeapDumpOnOutOfMemoryError
选项时,堆分析器 (HPROF) 提供的堆转储写入的路径和文件名。默认情况下,该文件在当前工作目录中创建,并且命名为 java_pid
-XX:HeapDumpPath=./java_pid%p.hprof
- Linux 和 macOS:以下示例显示如何将堆转储文件设置为
/var/log/java/java_heapdump.hprof
: ```shell - XX:HeapDumpPath=/var/log/java/java_heapdump.hprof ```
- Windows:以下示例显示如何将堆转储文件设置为
C:/log/java/java_heapdump.log
: ```shell - XX:HeapDumpPath=C:/log/java/java_heapdump.log ```
-XX:LogFile=path
设置日志数据写入的路径和文件名。默认情况下,该文件在当前工作目录中创建,并且命名为 hotspot.log
。
- Linux 和 macOS:以下示例显示如何将日志文件设置为
/var/log/java/hotspot.log
: ```shell - XX:LogFile=/var/log/java/hotspot.log ```
- Windows:以下示例显示如何将堆转储文件设置为
C:/log/java/java_heapdump.log
: ```shell - XX:LogFile=C:/log/java/hotspot.log ```
-XX:+PrintClassHistogram
在以下事件之一之后启用打印类实例直方图
Linux 和 macOS:Control+Break
Windows:Control+C (SIGTERM)
默认情况下,此选项禁用。
设置此选项等效于运行 jmap -histo
命令或 jcmd pid GC.class_histogram
命令,其中 pid 是当前 Java 进程标识符。
-XX:+PrintConcurrentLocks
在以下事件之一之后启用打印 java.util.concurrent 锁
Linux 和 macOS:Control+Break
Windows:Control+C (SIGTERM)
默认情况下,此选项禁用。
设置此选项等效于运行 jstack -l 命令或 jcmd pid Thread.print -l 命令,其中 pid 是当前 Java 进程标识符。
-XX:+PrintFlagsRanges
打印指定的范围并允许自动测试值。请参阅验证 Java 虚拟机标志参数。
-XX:+UnlockDiagnosticVMOptions
解锁用于诊断 JVM 的选项。默认情况下,此选项禁用,诊断选项不可用。
高级垃圾收集选项
这些 java 选项控制 Java HotSpot VM 如何执行垃圾收集 (GC)。
-XX:+AggressiveHeap
启用 Java 堆优化。这会根据计算机的配置(RAM 和 CPU)设置各种参数,使其最适合具有密集内存分配的长时间运行作业。默认情况下,该选项禁用,并且不会优化堆。
-XX:+AlwaysPreTouch
在 JVM 初始化期间启用对 Java 堆上每个页面的触摸。这会将所有页面放入内存,然后再进入 main() 方法。该选项可用于测试以模拟具有所有虚拟内存映射到物理内存的长时间运行系统。默认情况下,此选项禁用,并且所有页面都在 JVM 堆空间填满时提交。
-XX:+CMSClassUnloadingEnabled
在使用并发标记清除 (CMS) 垃圾收集器时启用类卸载。此选项默认情况下启用。要禁用 CMS 垃圾收集器的类卸载,请指定 -XX:-CMSClassUnloadingEnabled
。
-XX:CMSExpAvgFactor=percent
设置用于在计算并发收集统计信息的指数平均值时加权当前样本的时间百分比(0 到 100)。默认情况下,指数平均值因子设置为 25%。以下示例显示如何将因子设置为 15%
-XX:CMSExpAvgFactor=15
-XX:CMSIncrementalDutySafetyFactor=percent
设置用于在计算占空比时添加保守性的百分比(0 到 100)。默认值为 10。
-XX:+CMSScavengeBeforeRemark
在 CMS 备注步骤之前启用清除尝试。默认情况下,此选项禁用。
-XX:CMSTriggerRatio=percent
设置在开始 CMS 收集周期之前分配的选项 -XX:MinHeapFreeRatio
指定的值的百分比(0 到 100)。默认值为 80%。
以下示例显示如何将占用率分数设置为 75%
-XX:CMSTriggerRatio=75
-XX:ConcGCThreads=threads
设置用于并发 GC 的线程数。将线程设置为大约并行垃圾收集线程数的 1/4。默认值取决于 JVM 可用的 CPU 数量。
例如,要将并发 GC 的线程数设置为 2,请指定以下选项
-XX:ConcGCThreads=2
-XX:+DisableExplicitGC
启用禁用处理对 System.gc() 方法的调用的选项。此选项默认情况下禁用,这意味着处理对 System.gc() 的调用。如果禁用处理对 System.gc() 的调用,则 JVM 仍然会在必要时执行 GC。
-XX:+ExplicitGCInvokesConcurrent
启用使用 System.gc() 请求调用并发 GC。此选项默认情况下禁用,并且只能与已弃用的 -XX:+UseConcMarkSweepGC 选项和 -XX:+UseG1GC 选项一起启用。
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
启用使用 System.gc() 请求调用并发 GC 并在并发 GC 周期中卸载类。此选项默认情况下禁用,并且只能与已弃用的 -XX:+UseConcMarkSweepGC 选项一起启用。
-XX:G1HeapRegionSize=size
设置在使用垃圾优先 (G1) 收集器时 Java 堆细分的区域大小。该值是 2 的幂,可以介于 1 MB 到 32 MB 之间。目标是根据最小 Java 堆大小拥有大约 2048 个区域。默认区域大小是根据堆大小以符合人体工程学的方式确定的。
以下示例将细分的尺寸设置为 16 MB
-XX:G1HeapRegionSize=16m
-XX:G1HeapWastePercent=percent
设置您愿意浪费的堆的百分比。当可回收百分比小于堆浪费百分比时,Java HotSpot VM 不会启动混合垃圾收集周期。默认值为 5%。
-XX:G1MaxNewSizePercent=percent
设置堆大小的百分比,用作年轻代大小的最大值。默认值为 Java 堆的 60%。
这是一个实验性标志。此设置将替换 -XX:DefaultMaxNewGenPercent 设置。
此设置在 Java HotSpot VM 构建 23 或更早版本中不可用。
-XX:G1MixedGCCountTarget=number
设置标记周期后混合垃圾收集的预期次数,以收集最多包含 G1MixedGCLIveThresholdPercent 活数据的旧区域。默认值为 8 次混合垃圾收集。混合收集的目标是在此预期次数内。
此设置在 Java HotSpot VM 构建 23 或更早版本中不可用。
-XX:G1MixedGCLiveThresholdPercent=percent
设置旧区域的占用率阈值,以将其包含在混合垃圾收集周期中。默认占用率为 85%。
这是一个实验性标志。此设置将替换 -XX:G1OldCSetRegionLiveThresholdPercent 设置。
此设置在 Java HotSpot VM 构建 23 或更早版本中不可用。
-XX:G1NewSizePercent=percent
设置堆的百分比,用作年轻代大小的最小值。默认值为 Java 堆的 5%。
这是一个实验性标志。此设置将替换 -XX:DefaultMinNewGenPercent 设置。
此设置在 Java HotSpot VM 构建 23 或更早版本中不可用。
-XX:G1OldCSetRegionThresholdPercent=percent
设置混合垃圾收集周期中要收集的旧区域数量的上限。默认值为 Java 堆的 10%。
此设置在 Java HotSpot VM 构建 23 或更早版本中不可用。
-XX:G1ReservePercent=percent
设置堆的百分比(0 到 50),作为假上限保留,以减少 G1 收集器出现提升失败的可能性。当您增加或减少百分比时,请确保您以相同数量调整总 Java 堆。默认情况下,此选项设置为 10%。
以下示例将保留的堆设置为 20%
-XX:G1ReservePercent=20
-XX:InitialHeapOccupancyPercent=percent
设置触发标记周期的 Java 堆占用率阈值。默认占用率为整个 Java 堆的 45%。
-XX:InitialHeapSize=size
设置内存分配池的初始大小(以字节为单位)。此值必须为 0 或 1024 的倍数,且大于 1 MB。附加字母 k 或 K 表示千字节,m 或 M 表示兆字节,g 或 G 表示吉字节。默认值在运行时根据系统配置选择。
以下示例显示如何使用各种单位将分配内存的大小设置为 6 MB
-XX:InitialHeapSize=6291456
-XX:InitialHeapSize=6144k
-XX:InitialHeapSize=6m
如果将此选项设置为 0,则初始大小将设置为分配给旧代和年轻代的大小之和。年轻代的堆大小可以使用 -XX:NewSize 选项设置。
-XX:InitialSurvivorRatio=ratio
设置吞吐量垃圾收集器使用的初始幸存者空间比率(通过 -XX:+UseParallelGC 和/或 -XX:+UseParallelOldGC 选项启用)。默认情况下,使用 -XX:+UseParallelGC 和 -XX:+UseParallelOldGC 选项,吞吐量垃圾收集器启用了自适应大小调整,幸存者空间根据应用程序行为调整大小,从初始值开始。如果自适应大小调整被禁用(使用 -XX:-UseAdaptiveSizePolicy 选项),则应使用 -XX:SurvivorRatio 选项设置应用程序整个执行期间幸存者空间的大小。
以下公式可用于根据年轻代的大小(Y)和初始幸存者空间比率(R)计算幸存者空间的初始大小(S)
S=Y/(R+2)
公式中的 2 表示两个幸存者空间。指定为初始幸存者空间比率的值越大,初始幸存者空间的大小越小。
默认情况下,初始幸存者空间比率设置为 8。如果使用年轻代空间大小的默认值(2 MB),则幸存者空间的初始大小为 0.2 MB。
以下示例显示如何将初始幸存者空间比率设置为 4
-XX:InitialSurvivorRatio=4
-XX:InitiatingHeapOccupancyPercent=percent
设置堆占用率的百分比(0 到 100),在此百分比下开始并发 GC 周期。它由基于整个堆的占用率(而不仅仅是其中一代的占用率)触发并发 GC 周期的垃圾收集器使用(例如,G1 垃圾收集器)。
默认情况下,启动值设置为 45%。值为 0 表示不停地进行 GC 周期。以下示例显示如何将启动堆占用率设置为 75%
-XX:InitiatingHeapOccupancyPercent=75
-XX:MaxGCPauseMillis=time
设置最大 GC 暂停时间的目标(以毫秒为单位)。这是一个软目标,JVM 将尽最大努力实现它。指定的值不会适应您的堆大小。默认情况下,没有最大暂停时间值。
以下示例显示如何将最大目标暂停时间设置为 500 毫秒
-XX:MaxGCPauseMillis=500
-XX:MaxHeapSize=size 设置内存分配池的最大大小(以字节为单位)。此值必须为 1024 的倍数,且大于 2 MB。附加字母 k 或 K 表示千字节,m 或 M 表示兆字节,g 或 G 表示吉字节。默认值在运行时根据系统配置选择。对于服务器部署,选项 -XX:InitialHeapSize 和 -XX:MaxHeapSize 通常设置为相同的值。
以下示例显示如何使用各种单位将分配内存的最大允许大小设置为 80 MB
-XX:MaxHeapSize=83886080
-XX:MaxHeapSize=81920k
-XX:MaxHeapSize=80m
-XX:MaxHeapSize 选项等效于 -Xmx。
-XX:MaxHeapFreeRatio=percent
设置 GC 事件后允许的最大空闲堆空间百分比(0 到 100)。如果空闲堆空间扩展到超过此值,则堆将缩小。默认情况下,此值设置为 70%。
通过降低 MaxHeapFreeRatio(默认值为 70%)和 MinHeapFreeRatio(默认值为 40%)的参数值,使用命令行选项 -XX:MaxHeapFreeRatio 和 -XX:MinHeapFreeRatio 来最小化 Java 堆大小。将 MaxHeapFreeRatio 降低至 10%,将 MinHeapFreeRatio 降低至 5% 已成功减小了堆大小,而性能下降并不明显;但是,结果可能因应用程序而异。尝试使用不同的参数值,直到它们尽可能低,但仍然保持可接受的性能。
-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5
尝试保持堆大小较小的客户还应添加选项 -XX:-ShrinkHeapInSteps。有关使用此选项通过减少嵌入式应用程序的动态占用空间来保持 Java 堆大小较小的说明,请参阅性能调整示例。
-XX:NewRatio=ratio
设置年轻代和老年代大小之间的比率。默认情况下,此选项设置为 2。以下示例显示如何将年轻代与老年代的比率设置为 1
-XX:NewRatio=1
-XX:NewSize=size
设置年轻代(育苗器)的堆的初始大小(以字节为单位)。附加字母 k 或 K 表示千字节,m 或 M 表示兆字节,g 或 G 表示吉字节。
堆的年轻代区域用于新对象。与其他区域相比,此区域中更频繁地执行 GC。如果年轻代的大小太小,则会执行大量次要 GC。如果大小太大,则只会执行完全 GC,这可能需要很长时间才能完成。Oracle 建议您将年轻代的大小保持在总堆大小的 25% 到 50% 之间。
以下示例显示如何使用各种单位将年轻代的初始大小设置为 256 MB
-XX:NewSize=256m
-XX:NewSize=262144k
-XX:NewSize=268435456
-XX:NewSize 选项等效于 -Xmn。
-XX:ParallelGCThreads=threads
设置停止世界 (STW) 工作线程的值。此选项将线程的值设置为逻辑处理器的数量。线程的值与逻辑处理器的数量相同,最多为 8 个。
如果逻辑处理器超过 8 个,则此选项将线程的值设置为逻辑处理器的约 5/8。这在大多数情况下都有效,除了较大的 SPARC 系统,其中线程的值可以是逻辑处理器的约 5/16。
默认值取决于 JVM 可用的 CPU 数量。
例如,要将并行 GC 的线程数设置为 2,请指定以下选项
-XX:ParallelGCThreads=2
-XX:+ParallelRefProcEnabled
启用并行引用处理。默认情况下,此选项被禁用。
-XX:+PrintAdaptiveSizePolicy
启用打印有关自适应代大小调整的信息。默认情况下,此选项被禁用。
-XX:+ScavengeBeforeFullGC
在每次完全 GC 之前启用年轻代的 GC。此选项默认情况下已启用。Oracle 建议您不要禁用它,因为在完全 GC 之前清除年轻代可以减少从老年代空间到年轻代空间的可达对象的数量。要禁用在每次完全 GC 之前清除年轻代,请指定选项 -XX:-ScavengeBeforeFullGC。
-XX:-ShrinkHeapInSteps
将 Java 堆逐步减小到目标大小,目标大小由选项 –XX:MaxHeapFreeRatio 指定。此选项默认情况下已启用。如果禁用,则它会立即将 Java 堆减小到目标大小,而不是需要多个垃圾收集周期。如果您想最小化 Java 堆大小,请禁用此选项。禁用此选项可能会导致性能下降。
有关使用 MaxHeapFreeRatio 选项通过减少嵌入式应用程序的动态占用空间来保持 Java 堆大小较小的说明,请参阅性能调整示例。
–XX:StringDeduplicationAgeThreshold=threshold
标识达到指定年龄的 String 对象,这些对象被视为重复数据删除的候选对象。对象的年龄是衡量它在垃圾收集中存活了多少次的指标。这有时被称为老化。请参阅已弃用的 -XX:+PrintTenuringDistribution 选项。
-XX:SurvivorRatio=ratio
设置伊甸园空间大小与幸存者空间大小之间的比率。默认情况下,此选项设置为 8。以下示例显示如何将伊甸园/幸存者空间比率设置为 4
-XX:SurvivorRatio=4
-XX:TargetSurvivorRatio=percent
设置年轻垃圾收集后使用的幸存者空间的预期百分比(0 到 100)。默认情况下,此选项设置为 50%。
以下示例显示如何将目标幸存者空间比率设置为 30%
-XX:TargetSurvivorRatio=30
-XX:TLABSize=size
设置线程本地分配缓冲区 (TLAB) 的初始大小(以字节为单位)。附加字母 k 或 K 表示千字节,m 或 M 表示兆字节,g 或 G 表示吉字节。如果将此选项设置为 0,则 JVM 会自动选择初始大小。
以下示例显示如何将初始 TLAB 大小设置为 512 KB
-XX:TLABSize=512k
-XX:+UseAdaptiveSizePolicy
启用自适应代大小调整的使用。此选项默认情况下已启用。要禁用自适应代大小调整,请指定 -XX:-UseAdaptiveSizePolicy 并显式设置内存分配池的大小。请参阅 -XX:SurvivorRatio 选项。
-XX:+UseCMSInitiatingOccupancyOnly
启用将占用值用作启动 CMS 收集器的唯一标准。默认情况下,此选项被禁用,可能会使用其他标准。
-XX:+UseG1GC
启用使用垃圾优先 (G1) 垃圾收集器。它是一种面向服务器的垃圾收集器,针对具有大量 RAM 的多处理器机器。此选项以高概率满足 GC 暂停时间目标,同时保持良好的吞吐量。对于需要大型堆(大小约为 6 GB 或更大)且对 GC 延迟要求有限(稳定的可预测暂停时间低于 0.5 秒)的应用程序,建议使用 G1 收集器。默认情况下,此选项已启用,G1 被用作默认垃圾收集器。
-XX:+UseGCOverheadLimit
启用使用一项策略,该策略限制 JVM 在抛出 OutOfMemoryError 异常之前在 GC 上花费的时间比例。默认情况下,此选项已启用,并且如果在垃圾收集上花费的时间超过总时间的 98%,而堆回收的比例低于 2%,则并行 GC 将抛出 OutOfMemoryError。当堆很小时,可以使用此功能来防止应用程序长时间运行而几乎没有或根本没有进展。要禁用此选项,请指定选项 -XX:-UseGCOverheadLimit。
-XX:+UseNUMA
通过增加应用程序对低延迟内存的使用,启用在具有非一致内存体系结构 (NUMA) 的机器上对应用程序进行性能优化。默认情况下,此选项被禁用,并且不会进行 NUMA 优化。该选项仅在使用并行垃圾收集器时可用 (-XX:+UseParallelGC)。
-XX:+UseParallelGC
启用使用并行清除垃圾收集器(也称为吞吐量收集器)来通过利用多个处理器来提高应用程序的性能。
默认情况下,此选项被禁用,并且会根据机器的配置和 JVM 的类型自动选择收集器。如果启用它,则会自动启用 -XX:+UseParallelOldGC 选项,除非您明确禁用它。
-XX:+UseParallelOldGC
启用使用并行垃圾收集器进行完整 GC。默认情况下,此选项被禁用。启用它会自动启用 -XX:+UseParallelGC 选项。
-XX:+UseSerialGC
启用使用串行垃圾收集器。对于不需要垃圾收集任何特殊功能的小型简单应用程序,这通常是最佳选择。默认情况下,此选项被禁用,并且会根据机器的配置和 JVM 的类型自动选择收集器。
-XX:+UseSHM
仅限 Linux:启用 JVM 使用共享内存来设置大页面。
有关设置大页面的信息,请参阅大页面。
-XX:+UseStringDeduplication
启用字符串重复数据删除。默认情况下,此选项被禁用。要使用此选项,您必须启用垃圾优先 (G1) 垃圾收集器。
字符串重复数据删除通过利用许多 String 对象相同的事实来减少 Java 堆上 String 对象的内存占用。与每个 String 对象都指向自己的字符数组不同,相同的 String 对象可以指向并共享相同的字符数组。
-XX:+UseTLAB
启用在年轻代空间中使用线程本地分配块 (TLAB)。此选项默认情况下已启用。要禁用使用 TLAB,请指定选项 -XX:-UseTLAB。
-XX:+UseZGC
启用使用 Z 垃圾收集器 (ZGC)。这是一种低延迟垃圾收集器,提供几毫秒的最大暂停时间,但会以一定的吞吐量为代价。暂停时间与使用的堆大小无关。支持从 8 MB 到 16 TB 的堆大小。
-XX:ZAllocationSpikeTolerance=factor
设置 ZGC 的分配峰值容忍度。默认情况下,此选项设置为 2.0。此因子描述了预期分配峰值的级别。例如,使用 3.0 的因子意味着当前分配率可以预期在任何时候都增加三倍。
-XX:ZCollectionInterval=seconds
设置使用 ZGC 时两次 GC 周期之间的最大间隔(以秒为单位)。默认情况下,此选项设置为 0(禁用)。
-XX:ZFragmentationLimit=percent
设置 ZGC 的最大可接受堆碎片(以百分比表示)。默认情况下,此选项设置为 25。使用较低的值会导致堆更积极地进行压缩,以便以使用更多 CPU 时间为代价来回收更多内存。
-XX:+ZProactive
启用使用 ZGC 时主动 GC 周期。默认情况下,此选项已启用。如果这样做预计对正在运行的应用程序的影响最小,则 ZGC 将启动主动 GC 周期。如果应用程序大部分处于空闲状态或分配的对象很少,但您仍然希望保持堆大小较小并允许引用处理即使堆上有大量可用空间也能发生,这很有用。
-XX:+ZUncommit
启用使用 ZGC 时取消提交未使用的堆内存。默认情况下,此选项已启用。取消提交未使用的堆内存将降低 JVM 的内存占用,并使该内存可供其他进程使用。
-XX:ZUncommitDelay=seconds
设置堆内存必须未被使用多长时间(以秒为单位)才能被取消提交。默认情况下,此选项设置为 300(5 分钟)。提交和取消提交内存是相对昂贵的操作。使用较低的值会导致堆内存更早地被取消提交,但存在很快需要再次提交它的风险。
已弃用的 Java 选项
这些 Java 选项已弃用,可能会在将来的 JDK 版本中删除。它们仍然被接受并被执行,但在使用它们时会发出警告。
--illegal-access=parameter
运行时,--illegal-access=
接受一个关键字参数来指定操作模式。
注意:此选项将在将来的版本中删除。
permit
:此模式在运行时映像中的每个模块的每个包中打开所有未命名模块(例如类路径上的代码)中的代码,如果该包存在于 JDK 8 中。这允许通过平台的各种反射 API 进行静态访问(例如,通过编译的字节码和深度反射访问)。对任何此类包的第一个反射访问操作会导致发出警告。但是,在第一次出现后不会发出警告。此单个警告描述了如何启用更多警告。warn
:此模式与 permit 相同,只是对每个非法的反射访问操作都会发出警告消息。debug
:此模式与 warn 相同,只是对每个非法的反射访问操作都会发出警告消息和堆栈跟踪。deny
:此模式禁用所有非法的访问操作,除了由其他命令行选项(如--add-opens
)启用的操作。此模式是默认模式。
如果您的应用程序无法使用 --illegal-access=deny 的默认模式,那么您可以使用 warn 和 debug 模式了解更多信息。对于类路径上每个需要非法访问的库或框架,您有两个选择
- 如果组件的维护者已经发布了不再使用 JDK 内部 API 的修复版本,那么您可以考虑升级到该版本。
- 如果组件仍然需要修复,那么您可以联系其维护者并要求他们用适当的导出 API 替换他们对 JDK 内部 API 的使用。
如果您必须继续使用需要非法访问的组件,那么您可以通过使用一个或多个 --add-opens 选项来打开仅需要访问的内部包来消除警告消息。
要验证您的应用程序是否已准备好用于将来的 JDK 版本,请使用 --illegal-access=deny 以及任何必要的 --add-opens 选项运行它。任何剩余的非法访问错误很可能是由于已编译代码对 JDK 内部 API 的静态引用造成的。您可以通过使用 --jdk-internals 选项运行 jdeps 工具来识别这些错误。出于性能原因,当前 JDK 不会对非法的静态访问操作发出警告。
-Xfuture
启用严格的类文件格式检查,这些检查强制严格遵守类文件格式规范。 开发人员在开发新代码时应使用此标志。 在将来的版本中,更严格的检查可能会成为默认设置。
-Xloggc:filename
设置应将详细 GC 事件信息重定向到的文件以进行日志记录。如果在同一个 java 命令中同时给出 -Xloggc 选项和 -verbose:gc,则 -Xloggc:filename 会覆盖 -verbose:gc。-Xloggc:filename 被 -Xlog:gc:filename 替换。请参阅使用 JVM 统一日志记录框架启用日志记录。
示例
-Xlog:gc:garbage-collection.log
-XX:+FlightRecorder
启用在应用程序运行时使用 Java Flight Recorder (JFR)。从 JDK 8u40 开始,此选项不再需要使用 JFR。
-XX:InitialRAMFraction=ratio
设置 JVM 在应用人体工程学启发式方法之前可能用于 Java 堆的初始内存量,作为 -XX:MaxRAM 选项中所述确定的最大量的比率。默认值为 64。
使用选项 -XX:InitialRAMPercentage 代替。
-XX:MaxRAMFraction=ratio
设置 JVM 在应用人体工程学启发式方法之前可能用于 Java 堆的最大内存量,作为 -XX:MaxRAM 选项中所述确定的最大量的比率。默认值为 4。
指定此选项会禁用自动使用压缩 oops,如果此选项和其他影响最大内存量的选项的组合结果大于压缩 oops 可寻址的内存范围。有关压缩 oops 的更多信息,请参阅 -XX:UseCompressedOops。
使用选项 -XX:MaxRAMPercentage 代替。
-XX:MinRAMFraction=ratio
设置 JVM 在应用人体工程学启发式方法之前可能用于 Java 堆的最大内存量,作为 -XX:MaxRAM 选项中所述确定的最大量的比率,用于小型堆。小型堆是指大约 125 MB 的堆。默认值为 2。
使用选项 -XX:MinRAMPercentage
代替。
-XX:+UseBiasedLocking
启用使用偏向锁。一些具有大量无竞争同步的应用程序在启用此标志后可能会获得显著的加速,但具有某些锁定模式的应用程序可能会看到速度下降。
默认情况下,此选项禁用。
已过时的 Java 选项
这些 Java 选项仍然被接受,但被忽略,并且在使用它们时会发出警告。
-XX:+UseMembar
启用在线程状态转换时发出 membar。此选项默认情况下在所有平台上都被禁用,除了 ARM 服务器,在那里它被启用。
-XX:MaxPermSize=size
设置最大永久代空间大小(以字节为单位)。此选项在 JDK 8 中已弃用,并被 -XX:MaxMetaspaceSize 选项取代。
-XX:PermSize=size
设置分配给永久代的空间(以字节为单位),如果超过该空间,将触发垃圾收集。此选项在 JDK 8 中已弃用,并被 -XX:MetaspaceSize 选项取代。
-XX:+TraceClassLoading
启用对类加载时的跟踪。默认情况下,此选项被禁用,并且不会跟踪类。
替代的统一日志记录语法是 -Xlog:class+load=level
。请参阅使用 JVM 统一日志记录框架启用日志记录
对于常规信息,使用 level=info,或者对于更多信息,使用 level=debug。在统一日志记录语法中,-verbose:class
等于 -Xlog:class+load=info,class+unload=info
。
-XX:+TraceClassLoadingPreorder
启用对所有已加载类的跟踪,按它们被引用的顺序进行跟踪。默认情况下,此选项被禁用,并且不会跟踪类。
替代的统一日志记录语法是 -Xlog:class+preorder=debug
。请参阅使用 JVM 统一日志记录框架启用日志记录。
-XX:+TraceClassResolution
启用对常量池解析的跟踪。默认情况下,此选项被禁用,并且不会跟踪常量池解析。
替代的统一日志记录语法是 -Xlog:class+resolve=debug
。请参阅使用 JVM 统一日志记录框架启用日志记录。
-XX:+TraceLoaderConstraints
启用对加载器约束记录的跟踪。默认情况下,此选项被禁用,并且不会跟踪加载器约束记录。
替代的统一日志记录语法是 -Xlog:class+loader+constraints=info。请参阅使用 JVM 统一日志记录框架启用日志记录。
已删除的 Java 选项
这些 Java 选项已在 JDK 16 中移除,使用它们会导致以下错误:Unrecognized VM option
option-name
-XX:+UseParallelOldGC
启用使用并行垃圾收集器进行完整 GC。默认情况下,此选项被禁用。启用它会自动启用 -XX:+UseParallelGC 选项。
命令行参数文件
您可以使用 @ 参数文件来缩短或简化 java 命令,以指定一个或多个包含参数的文本文件,例如传递给 java 命令的选项和类名。这使您能够在任何操作系统上创建任何长度的 java 命令。
在命令行中,使用符号 (@) 前缀来标识包含 java 选项和类名的参数文件。当 java 命令遇到以符号 (@) 开头的文件时,它会将该文件的内容扩展到一个参数列表中,就像它们在命令行中指定的那样。
java 启动器会扩展参数文件的内容,直到遇到 --disable-@files
选项。您可以在命令行的任何位置使用 --disable-@files
选项,包括在参数文件中,以停止 @ 参数文件的扩展。
以下内容描述了 java 参数文件的语法
参数文件必须仅包含 ASCII 字符或系统默认编码中的 ASCII 友好字符,例如 UTF-8。
参数文件大小不得超过
MAXINT
(2,147,483,647) 字节。启动器不会扩展参数文件中存在的通配符。
使用空格或换行符来分隔文件中包含的参数。
空格包括空格字符、
\t, \n, \r
和\f
。例如,可以有一个包含空格的路径,例如c:\Program Files
,可以指定为 "c:\\Program Files
" 或,为了避免转义,c:\Program" "Files
。任何包含空格的选项,例如路径组件,必须用引号 ('"') 字符将其整体括起来。
引号中的字符串可能包含字符
\n, \r, \t
和\f
。它们将被转换为各自的 ASCII 代码。如果文件名包含嵌入的空格,则将整个文件名放在双引号中。
参数文件中的文件名相对于当前目录,而不是相对于参数文件的位置。
在参数文件中使用井号 # 来标识注释。井号后面的所有字符都会被忽略,直到行尾。
附加的符号 (@) 前缀到 @ 前缀的选项充当转义符(第一个 @ 被移除,其余参数按字面意思呈现给启动器)。
可以使用行尾的续行符 (
\
) 来继续行。这两行将被连接起来,并修剪掉前导空格。为了防止修剪前导空格,可以在第一列放置一个续行符 (\
)。由于反斜杠 (
\
) 是一个转义字符,因此反斜杠字符必须用另一个反斜杠字符转义。允许部分引号,并由文件结尾关闭。
打开的引号在行尾停止,除非 \ 是最后一个字符,在这种情况下,它会通过删除所有前导空格字符来连接下一行。
这些列表中不允许使用通配符 (*)(例如指定 *.java)。
不支持使用符号 (@) 来递归解释文件。
参数文件中打开或部分引号的示例
在参数文件中,
-cp "lib/
cool/
app/
jars
这被解释为
-cp lib/cool/app/jars
参数文件中用另一个反斜杠字符转义的反斜杠字符的示例 要输出以下内容
-cp c:\Program Files (x86)\Java\jre\lib\ext;c:\Program Files\Java\jre9\lib\ext
反斜杠字符必须在参数文件中指定为
-cp "c:\\Program Files (x86)\\Java\\jre\\lib\\ext;c:\\Program Files\\Java\\jre9\\lib\\ext"
参数文件中使用 EOL 转义强制连接行的示例 在参数文件中,
-cp "/lib/cool app/jars:\
/lib/another app/jars"
这被解释为
-cp /lib/cool app/jars:/lib/another app/jars
参数文件中带有前导空格的行继续的示例 在参数文件中,
-cp "/lib/cool\
\app/jars???
这被解释为
-cp /lib/cool app/jars
使用单个参数文件的示例 您可以使用单个参数文件,例如以下示例中的 myargumentfile,来保存所有必需的 java 参数
java @myargumentfile
使用带有路径的参数文件的示例 您可以将相对路径包含在参数文件中;但是,它们相对于当前工作目录,而不是相对于参数文件本身的路径。在以下示例中,path1/options 和 path2/options 代表具有不同路径的参数文件。它们包含的任何相对路径都相对于当前工作目录,而不是相对于参数文件
java @path1/options @path2/classes
代码堆状态分析
概述
在某些情况下,深入了解 JVM 代码堆的当前状态将有助于回答以下问题
- 为什么 JIT 被关闭,然后又反复打开?
- 所有代码堆空间都去哪里了?
- 为什么方法清除器不能有效地工作?
为了提供这种洞察力,已经实现了一个代码堆状态分析功能,它能够对代码堆进行实时分析。分析过程分为两个部分。第一部分检查整个代码堆,并汇总所有被认为有用或重要的信息。第二部分包括几个独立的步骤,这些步骤会打印收集到的信息,重点关注数据的不同方面。数据收集和打印是在“按需”的基础上完成的。
语法
可以使用以下命令发出实时、动态分析的请求
jcmd pid Compiler.CodeHeap_Analytics [function] [granularity]
-Xlog:codecache=Trace
如果您只对运行示例工作负载后代码堆的外观感兴趣,可以使用命令行选项。
-Xlog:codecache=Debug
要查看“CodeCache 已满”条件存在时的代码堆状态,请使用命令行选项启动 VM。
使用 JVM 统一日志记录框架启用日志记录
您可以使用 -Xlog
选项来配置或启用 Java 虚拟机 (JVM) 统一日志记录框架的日志记录。
概要
-Xlog[:[what][:[output][:[decorators][:output-options[,...]]]]]
what
指定标签和级别的组合,形式为 tag1[+tag2...][*][=level][,...]
。除非指定了通配符 (*
),否则只匹配标记为指定标签的日志消息。请参阅 -Xlog 标签和级别。
output
设置输出类型。省略输出类型默认为 stdout。请参阅 -Xlog
输出。
decorators
配置输出以使用自定义的装饰器集。省略装饰器默认为运行时间、级别和标签。请参阅装饰。
output-options
设置 -Xlog
日志记录输出选项。
描述
Java 虚拟机 (JVM) 统一日志记录框架为 JVM 的所有组件提供了一个通用的日志记录系统。JVM 的 GC 日志记录已更改为使用新的日志记录框架。旧 GC 标志到相应的新 Xlog 配置的映射在将 GC 日志记录标志转换为 Xlog 中进行了描述。此外,运行时日志记录也已更改为使用 JVM 统一日志记录框架。旧运行时日志记录标志到相应的新 Xlog 配置的映射在将运行时日志记录标志转换为 Xlog 中进行了描述。
以下内容提供了对 -Xlog 命令和选项语法的快速参考
-Xlog
在信息级别上启用 JVM 日志记录。
-Xlog:help
打印 -Xlog 使用语法以及可用的标签、级别和装饰器,以及带有说明的示例命令行。
-Xlog:disable
关闭所有日志记录,并清除日志记录框架的所有配置,包括警告和错误的默认配置。
-Xlog[:option]
按它们在命令行中出现的顺序应用多个参数。对同一输出的多个 -Xlog 参数会按其给定的顺序相互覆盖。
选项设置为
[tag-selection][:[output][:[decorators][:output-options]]]
省略标签选择默认为所有标签集和信息级别。
tag[+...] all
all 标签是一个元标签,包含所有可用的标签集。标签集定义中的星号 * 表示通配符标签匹配。使用通配符匹配会选择包含至少指定标签的所有标签集。如果没有通配符,则只选择指定标签集的精确匹配。
output-options
为 filecount=file-count filesize=file-size
,可选 K
、M
或 G
后缀
默认配置
当命令行中指定了 -Xlog 选项,但没有其他内容时,将使用默认配置。默认配置记录所有级别匹配警告或错误的消息,无论消息与哪些标签相关联。默认配置等效于在命令行中输入以下内容
-Xlog:all=warning:stdout:uptime,level,tags
在运行时控制日志记录
日志记录也可以在运行时通过诊断命令(使用jcmd
实用程序)进行控制。命令行上可以指定的所有内容也可以使用 VM.log 命令动态指定。由于诊断命令会自动作为 MBean 公开,因此您可以使用 JMX 在运行时更改日志记录配置。
-Xlog
标签和级别
每个日志消息都与一个级别和一个标签集相关联。消息的级别对应于其详细信息,标签集对应于消息包含的内容或涉及的 JVM 组件(例如,gc、jit 或 os)。将 GC 标志映射到Xlog
配置的说明,请参见将 GC 日志记录标志转换为Xlog
。
可用的日志级别
- off
- trace
- debug
- info
- warning
- error
可用的日志标签
实际上有数十个日志标签,它们以正确的组合使用,将启用一系列日志输出。可以使用-Xlog:help
查看所有可用的日志标签。指定all
而不是标签组合将匹配所有标签组合。
-Xlog
输出
-Xlog
选项支持以下类型的输出
stdout
- 将输出发送到 stdoutstderr
- 将输出发送到 stderrfile=filename
- 将输出发送到文本文件。
使用 file=filename 时,在文件名中指定 %p 和/或 %t 将分别扩展为 JVM 的 PID 和启动时间戳。您还可以配置文本文件以根据文件大小和要轮换的文件数量来处理文件轮换。例如,要每 10 MB 轮换一次日志文件并保留 5 个文件进行轮换,请指定选项filesize=10M
、filecount=5
。文件的目标大小不能保证完全准确,只是一个近似值。默认情况下,文件将轮换,最多轮换 5 个目标大小为 20 MB 的文件,除非另有配置。指定filecount=0
表示不应轮换日志文件。可能存在覆盖现有日志文件的可能性。
装饰
日志消息用有关消息的信息进行装饰。您可以配置每个输出以使用一组自定义装饰器。输出的顺序始终与表中列出的顺序相同。您可以配置在运行时使用的装饰器。装饰器将附加到日志消息之前。例如
[6.567s][info][gc,old] Old collection complete
省略decorators
默认为uptime
、level
和tags
。none
装饰器是特殊的,用于关闭所有装饰器。
time
(t)、utctime
(utc)、uptime
(u)、timemillis
(tm)、uptimemillis
(um)、timenanos
(tn)、uptimenanos
(un)、hostname
(hn)、pid
(p)、tid
(ti)、level
(l)、tags
(tg) 装饰器也可以指定为 none,表示不进行装饰。
装饰说明 time
或 t
- 以 ISO-8601 格式表示的当前时间和日期。utctime
或 utc
- 世界协调时间或协调世界时。uptime
或 u
- 自 JVM 启动以来的时间(以秒和毫秒表示)。例如,6.567s。timemillis
或 tm
- 与 System.currentTimeMillis() 生成的值相同。uptimemillis
或 um
- 自 JVM 启动以来的毫秒数。timenanos
或 tn
与 System.nanoTime() 生成的值相同。uptimenanos
或 un
- 自 JVM 启动以来的纳秒数。hostname
或 hn
- 主机名。pid
或 p
- 进程标识符。tid
或 ti
- 线程标识符。level
或 l
- 与日志消息关联的级别。tags
或 tg
- 与日志消息关联的标签集。
-Xlog
使用示例
以下是-Xlog
示例。
-Xlog
使用 info 级别将所有消息记录到 stdout,并使用 uptime、级别和标签装饰器。这等效于使用
-Xlog:all=info:stdout:uptime,levels,tags
-Xlog:gc
使用 info 级别将标记为 gc 标签的消息记录到 stdout。所有其他消息的默认配置在级别警告下生效。
-Xlog:gc,safepoint
使用 info 级别将标记为 gc 或 safepoint 标签的消息记录到 stdout,并使用默认装饰器。标记为 gc 和 safepoint 的消息将不会记录。
-Xlog:gc+ref=debug
使用 debug 级别将标记为 gc 和 ref 标签的消息记录到 stdout,并使用默认装饰器。仅标记为这两个标签之一的消息将不会记录。
-Xlog:gc=debug:file=gc.txt:none
使用 debug 级别将标记为 gc 标签的消息记录到名为 gc.txt 的文件,不使用任何装饰器。所有其他消息的默认配置在级别警告下仍然生效。
-Xlog:gc=trace:file=gctrace.txt:uptimemillis,pids:filecount=5,filesize=1024
使用 trace 级别将标记为 gc 标签的消息记录到一个轮换文件集中,该文件集包含 5 个大小为 1 MB 的文件,基本名称为 gctrace.txt,并使用装饰器 uptimemillis 和 pid。
所有其他消息的默认配置在级别警告下仍然生效。
-Xlog:gc::uptime,tid
使用默认的 'info' 级别将标记为 gc 标签的消息记录到默认输出 stdout,并使用装饰器 uptime 和 tid。所有其他消息的默认配置在级别警告下仍然生效。
-Xlog:gc*=info,safepoint*=off
使用 info 级别记录标记为至少 gc 的消息,但关闭标记为 safepoint 的消息的记录。标记为 gc 和 safepoint 的消息将不会记录。
-Xlog:disable -Xlog:safepoint=trace:safepointtrace.txt
关闭所有日志记录,包括警告和错误,然后使用trace
级别将标记为safepoint
的消息启用到文件safepointtrace.txt
。默认配置不适用,因为命令行以-Xlog:disable
开头。
复杂的-Xlog
使用示例
以下描述了使用-Xlog
选项的一些复杂示例。
-Xlog:gc+class*=debug
使用 debug 级别将标记为至少 gc 和 class 标签的消息记录到 stdout。所有其他消息的默认配置在级别警告下仍然生效
-Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt
使用 trace 级别将标记为至少 gc 和 meta 标签的消息记录到文件 metatrace.txt,但关闭所有标记为 class 的消息。标记为 gc、meta 和 class 的消息不会记录,因为 class* 设置为 off。所有其他消息的默认配置在级别警告下仍然生效,除了包含 class 的消息。
-Xlog:gc+meta=trace
使用 trace 级别将标记为正好是 gc 和 meta 标签的消息记录到 stdout。所有其他消息的默认配置在级别警告下仍然生效。
-Xlog:gc+class+heap*=debug,meta*=warning,threads*=off
使用trace
级别将标记为至少gc
、class
和heap
标签的消息记录到stdout
,但仅记录标记为 meta 的消息,并使用级别。所有其他消息的默认配置在级别warning
下仍然生效,除了包含threads
的消息。
验证 Java 虚拟机标志参数
您使用提供给所有 Java 虚拟机 (JVM) 命令行标志的值进行验证,如果输入值无效或超出范围,则会显示相应的错误消息。
无论它们是通过人体工程学、命令行、输入工具还是通过 API(例如,包含在包 java.lang.management 中的类)设置的,提供给所有 Java 虚拟机 (JVM) 命令行标志的值都将被验证。人体工程学在 Java 平台标准版 HotSpot 虚拟机垃圾收集调整指南中进行了描述。
范围和约束在 JVM 初始化期间所有标志都设置了值时或在运行时更改了标志的值时(例如,使用 jcmd 工具)进行验证。如果值违反了范围或约束检查,则 JVM 将终止,并在错误流上打印相应的错误消息。
例如,如果标志违反了范围或约束检查,则 JVM 将退出并显示错误
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.
标志-XX:+PrintFlagsRanges
打印所有标志的范围。此标志允许通过范围提供的值自动测试标志。对于指定了范围的标志,类型、名称和实际范围将打印在输出中。
例如,
intx ThreadStackSize [ 0 ... 9007199254740987 ] {pd product}
对于没有指定范围的标志,值不会显示在打印输出中。例如
size_t NewSize [ ... ] {product}
这有助于识别需要实现的标志。自动测试框架可以跳过那些没有值且未实现的标志。
大页面
您使用大页面(也称为巨型页面)作为内存页面,其大小明显大于标准内存页面大小(根据处理器和操作系统而异)。大页面优化处理器转换旁路缓冲区。
转换旁路缓冲区 (TLB) 是一个页面转换缓存,它保存最近使用的虚拟到物理地址转换。TLB 是一种稀缺的系统资源。TLB 未命中可能代价高昂,因为处理器随后必须从分层页面表中读取,这可能需要多次内存访问。通过使用更大的内存页面大小,单个 TLB 条目可以表示更大的内存范围。这减少了对 TLB 的压力,内存密集型应用程序可能具有更好的性能。
但是,大页面页面内存可能会对系统性能产生负面影响。例如,当大量内存被应用程序固定时,它可能会导致常规内存短缺,并导致其他应用程序过度分页,从而减慢整个系统速度。此外,运行时间较长的系统可能会产生过度碎片,这可能会导致无法保留足够的大页面内存。发生这种情况时,操作系统或 JVM 会恢复使用常规页面。
Linux 和 Windows 支持大页面。
Linux 的大页面支持
2.6 内核支持大页面。一些供应商已将其代码移植到基于 2.4 的版本中。要检查您的系统是否支持大页面内存,请尝试以下操作
cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
如果输出显示三个“Huge”变量,则您的系统支持大页面内存,但需要进行配置。如果命令没有打印任何内容,则您的系统不支持大页面。要将系统配置为使用大页面内存,请以 root 用户身份登录,然后按照以下步骤操作
如果您使用的是选项 -XX:+UseSHM(而不是
-XX:+UseHugeTLBFS
),则需要增加SHMMAX
的值。它必须大于 Java 堆大小。在具有 4 GB 物理内存(或更少)的系统上,以下操作将使所有内存可共享echo 4294967295 > /proc/sys/kernel/shmmax
如果您使用的是选项 -XX:+UseSHM 或
-XX:+UseHugeTLBFS
,则需要指定大页面的数量。在以下示例中,4 GB 系统中的 3 GB 被保留用于大页面(假设大页面大小为2048kB
,则3 GB = 3 * 1024 MB = 3072 MB = 3072 * 1024 kB = 3145728 kB
,并且3145728 kB / 2048 kB = 1536
)echo 1536 > /proc/sys/vm/nr_hugepages
注意:/proc 中包含的值在您重新启动系统后会重置,因此您可能需要在初始化脚本(例如,rc.local
或 sysctl.conf
)中设置它们。
- 如果您配置(或调整大小)OS 内核参数
/proc/sys/kernel/shmmax
或/proc/sys/vm/nr_hugepages
,Java 进程可能会为除 Java 堆之外的区域分配大页面。这些步骤可以为以下区域分配大页面- Java 堆
- 代码缓存
- 并行 GC 的标记位图数据结构
Windows 的大页面支持
要在 Windows 上使用大页面支持,管理员必须首先为运行应用程序的用户分配额外的权限
- 选择控制面板、管理工具,然后选择本地安全策略。
- 选择本地策略,然后选择用户权限分配。
- 双击内存中的锁定页面,然后添加用户和/或组。
- 重新启动您的系统。
请注意,即使是管理员运行应用程序,也需要执行这些步骤,因为默认情况下管理员没有锁定内存中页面的权限。
应用程序类数据共享
应用程序类数据共享 (AppCDS) 扩展了类数据共享 (CDS),以允许将应用程序类放置在共享存档中。
除了核心库类之外,AppCDS 还支持来自以下位置的类数据共享
- 来自运行时映像的平台类
- 来自运行时映像的应用程序类
- 来自类路径的应用程序类
- 来自模块路径的应用程序类
存档应用程序类可以提高运行时的启动时间。在运行多个 JVM 进程时,AppCDS 还可以通过内存共享来减少运行时占用空间,以用于只读元数据。
CDS/AppCDS 支持从 JAR 文件存档类。
在 JDK 11 之前,在以下情况下,非空目录会被报告为致命错误
- 对于基本 CDS,在 -
Xbootclasspath/a
路径中不能存在非空目录 - 使用 -XX:+UseAppCDS 时,在
-Xbootclasspath/a
路径、类路径和模块路径中不能存在非空目录。
在 JDK 11 及更高版本中,-XX:+UseAppCDS
已过时,非空目录的行为基于 classlist 中的类类型。在以下情况下,非空目录会被报告为致命错误
- 如果未加载应用程序类或平台类,则仅当在 -Xbootclasspath/a 路径中存在非空目录时,转储时间才会报告错误
- 如果加载了应用程序类或平台类,则转储时间会报告在 -Xbootclasspath/a 路径、类路径或模块路径中存在的非空目录的错误
在 JDK 11 及更高版本中,使用-XX:DumpLoadedClassList=class_list_file
会生成一个包含所有类(系统库类和应用程序类)的 classlist。您不再需要在-XX:DumpLoadedClassList
中指定-XX:+UseAppCDS
来生成完整的类列表。
在 JDK 11 及更高版本中,由于UseAppCDS
已过时,因此 SharedArchiveFile 默认情况下成为产品标志。在任何配置中都不再需要为SharedArchiveFile
指定 +UnlockDiagnosticVMOptions
。
类数据共享 (CDS)/AppCDS 不支持在类列表中存档数组类。当遇到类列表中的数组时,CDS 转储时间会给出明确的错误消息
Preload Warning: Cannot find array_name
虽然类列表中不允许使用数组,但某些数组类仍然可以在 CDS/AppCDS 转储时间创建。这些数组是在 Java 类加载器(PlatformClassLoader
和系统类加载器)用于在转储时间加载类的 Java 代码执行期间创建的。创建的数组与其他已加载的类一起存档。
扩展类数据共享以支持模块路径
类数据共享 (CDS) 已得到改进,以支持从模块路径存档类。
要使用
--module-path
VM 选项创建 CDS 存档,请使用以下命令行语法java -Xshare:dump -XX:SharedClassListFile=class_list_file -XX:SharedArchiveFile=shared_archive_file --module-path=path_to_modular_jar -m module_name
要使用 --module-path VM 选项运行 CDS 存档,请使用以下命令行语法
java -XX:SharedArchiveFile=shared_archive_file --module-path=path_to_modular_jar -m module_name
下表描述了如何将与模块路径相关的 VM 选项与-Xshare
选项一起使用
1
虽然在--module-path
中指定模块有两种方法,即模块化 JAR 或展开模块,但只支持模块化 JAR。
2
转储时间和运行时间可以指定不同的 mp。如果存档类 K 在转储时间从 mp1.jar 加载,但 mp 中的更改导致它在运行时间从不同的 mp2.jar 加载,则存档版本的K
将在运行时间被忽略;K
将被动态加载。
3
目前,只有两个系统模块可升级(java.compiler 和jdk.internal.vm.compiler
)。但是,这些模块很少在生产软件中升级。
4
如 JEP 261 中所述,强烈建议不要在生产环境中使用--patch-module
。
5
--limit-modules
用于测试目的。它很少在生产软件中使用。
如果在转储时间指定了--upgrade-module-path
、--patch-module
或 --limit-modules
,则会打印错误消息,并且 JVM 将退出。例如,如果在转储时间指定了--limit-modules
选项,则用户将看到以下错误
Error occurred during initialization of VM
Cannot use the following option when dumping the shared archive: --limit-modules
如果在运行时间指定了--upgrade-module-path
、--patch-module
或 --limit-modules
,则会打印警告消息,指示 CDS 已禁用。例如,如果在运行时间指定了--limit-modules
选项,则用户将看到以下警告
Java HotSpot(TM) 64-Bit Server VM warning: CDS is disabled when the --limit-modules option is specified.
其他一些值得注意的事情包括
支持-cp
和--module-path
的任何有效组合。
模块路径中的非空目录会导致致命错误。用户将看到以下错误消息
Error: non-empty directory <directory> Hint: enable -Xlog:class+path=info to diagnose the failure Error occurred during initialization of VM Cannot have non-empty directory in paths
与类路径不同,转储时间的模块路径不必等于或为运行时间的模块路径的前缀。
如果模块路径中现有的 JAR 在存档生成后更新,则存档将失效。
从模块路径中删除 JAR 不会使共享存档失效。运行时不会使用来自已删除 JAR 的存档类。
动态 CDS 存档
动态 CDS 存档扩展了 AppCDS,允许在 Java 应用程序退出时存档类。它通过消除为每个应用程序创建类列表的试运行步骤来提高 AppCDS 的可用性。存档的类包括所有已加载的应用程序类和库类,这些类不在 JDK 中包含的默认 CDS 存档中。
创建动态存档时需要一个基本存档。如果未指定基本存档,则使用默认 CDS 存档作为基本存档。
要使用默认 CDS 存档作为基本存档创建动态 CDS 存档,只需将-XX:ArchiveClassesAtExit=<dynamic archive>
选项添加到运行 Java 应用程序的命令行中。
如果默认 CDS 存档不存在,则 VM 将退出并显示以下错误
ArchiveClassesAtExit not supported when base CDS archive is not loaded
要使用动态 CDS 存档运行 Java 应用程序,只需将-XX:SharedArchiveFile=<dynamic archive>
选项添加到运行 Java 应用程序的命令行中。
不需要在命令行中指定基本存档。基本存档信息(包括其名称和完整路径)将从动态存档标头中检索。请注意,用户也可以使用-XX:SharedArchiveFile
选项来指定常规 AppCDS 存档。因此,在-XX:SharedArchiveFile
选项中指定的存档可以是常规存档或动态存档。在 VM 启动期间,将读取指定的存档标头。如果-XX:SharedArchiveFile
指向常规存档,则行为将保持不变。如果-XX:SharedArchiveFile
指向动态存档,则 VM 将从动态存档中检索基本存档位置。如果动态存档是使用默认 CDS 存档创建的,则将使用当前默认 CDS 存档,并且将在当前运行时环境中找到它。
有关动态 CDS 存档转储时间和运行时间的错误检查详细信息,请参阅 JDK-8221706。
创建共享存档文件并使用它来运行应用程序
AppCDS 存档 以下步骤创建一个共享存档文件,其中包含test.Hello
应用程序使用的所有类。最后一步使用共享存档文件运行应用程序。
创建test.Hello
应用程序使用的所有类的列表。以下命令创建一个名为hello.classlist
的文件,其中包含此应用程序使用的所有类的列表
java -Xshare:off -XX:DumpLoadedClassList=hello.classlist -cp hello.jar test.Hello
请注意,-cp 参数指定的类路径中只能包含 JAR 文件。
创建一个名为 hello.jsa 的共享存档,其中包含 hello.classlist 中的所有类
java -Xshare:dump -XX:SharedArchiveFile=hello.jsa -XX:SharedClassListFile=hello.classlist -cp hello.jar
请注意,存档创建时的类路径必须与运行时的类路径相同(或为其前缀)。
使用共享存档hello.jsa
运行应用程序 test.Hello
java -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello
可选 验证 test.Hello 应用程序是否正在使用 hello.jsa 共享存档中包含的类
java -XX:SharedArchiveFile=hello.jsa -cp hello.jar -verbose:class test.Hello
此命令的输出应包含以下文本
Loaded test.Hello from shared objects file by sun/misc/Launcher$AppClassLoader
动态 CDS 存档
以下步骤创建一个动态 CDS 存档文件,其中包含 test.Hello
应用程序使用的类,这些类未包含在默认 CDS 存档中。第二步使用动态 CDS 存档运行应用程序。
创建一个名为 hello.jsa 的动态 CDS 存档,其中包含 hello.jar 中由应用程序 test.Hello 加载的所有类
java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
请注意,存档创建时的类路径必须与运行时的类路径相同(或为运行时类路径的前缀)。使用共享存档 hello.jsa 运行应用程序 test.Hello
java -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello
可选 重复上一节的步骤 4 以验证 test.Hello 应用程序是否正在使用 hello.jsa 共享存档中包含的类。为了自动化上述步骤 1 和 2,可以编写如下脚本
ARCHIVE=hello.jsa
if test -f $ARCHIVE; then
FLAG="-XX:SharedArchiveFile=$ARCHIVE"
else
FLAG="-XX:ArchiveClassesAtExit=$ARCHIVE"
fi
$JAVA_HOME/bin/java -cp hello.jar $FLAG test.Hello
与 AppCDS 存档类似,如果 Java 版本已更改,则需要重新生成存档。可以调整上述脚本以考虑 Java 版本,如下所示
ARCHIVE=hello.jsa
VERSION=foo.version
if test -f $ARCHIVE -a -f $VERSION && cmp -s $VERSION $JAVA_HOME/release; then
FLAG="-XX:SharedArchiveFile=$ARCHIVE"
else
FLAG="-XX:ArchiveClassesAtExit=$ARCHIVE"
cp -f $JAVA_HOME/release $VERSION
fi
$JAVA_HOME/bin/java -cp hello.jar $FLAG test.Hello
目前,我们不支持对同一 CDS 存档进行并发转储操作。应注意避免对同一 CDS 存档进行多个写入操作。用户还可以使用特定的基本存档创建动态 CDS 存档,例如,名为 base.jsa
的存档,如下所示
java -XX:SharedArchiveFile=base.jsa -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
要使用动态 CDS 存档 hello.jsa
和特定的基本 CDS 存档 base.jsa
运行应用程序
java -XX:SharedArchiveFile=base.jsa:hello.jsa -cp hello.jar Hello
请注意,在 Windows 上,上述路径分隔符 :
应替换为 ;
。
上述用于指定基本存档的命令在用于创建动态存档的基本存档已移动的情况下很有用。通常,只需指定动态存档就足够了,因为可以从动态存档标头中检索基本存档信息。
在多个应用程序进程之间共享共享存档
您可以在多个应用程序进程之间共享同一个存档文件。这减少了内存使用量,因为存档被内存映射到进程的地址空间。操作系统会自动在这些进程之间共享只读页面。
以下步骤演示如何创建可供不同应用程序共享的通用存档。来自 common.jar
、hello.jar
和 hi.jar
的类被存档在 common.jsa
中,因为它们在存档步骤(步骤 3)期间都在类路径中。
要包含来自 hello.jar
和 hi.jar
的类,必须将 .jar
文件添加到 -cp
参数指定的类路径中。
创建 Hello 应用程序使用的所有类的列表,以及 Hi 应用程序的另一个列表
java -XX:DumpLoadedClassList=hello.classlist -cp common.jar:hello.jar Hello
java -XX:DumpLoadedClassList=hi.classlist -cp common.jar:hi.jar Hi
创建将共享共享存档文件的所有应用程序使用的单个类列表。**Linux 和 macOS** 以下命令将文件 hello.classlist
和 hi.classlist
合并到一个文件 common.classlist
中
cat hello.classlist hi.classlist > common.classlist
**Windows** 以下命令将文件 hello.classlist
和 hi.classlist
合并到一个文件 common.classlist
中
type hello.classlist hi.classlist > common.classlist
创建一个名为 common.jsa
的共享存档,其中包含 common.classlist
中的所有类
java -Xshare:dump -XX:SharedArchiveFile=common.jsa -XX:SharedClassListFile=common.classlist -cp common.jar:hello.jar:hi.jar
使用的类路径参数是 Hello 和 Hi 应用程序共享的通用类路径前缀。
使用同一个共享存档运行 Hello
和 Hi
应用程序
java -XX:SharedArchiveFile=common.jsa -cp common.jar:hello.jar:hi.jar Hello
java -XX:SharedArchiveFile=common.jsa -cp common.jar:hello.jar:hi.jar Hi
指定添加到存档文件的其他共享数据
SharedArchiveConfigFile
选项用于指定要添加到存档文件的其他共享数据。
-XX:SharedArchiveConfigFile=shared_config_file
JDK 9 及更高版本支持在同一主机上运行多个 JVM 进程时将符号和字符串对象都添加到存档中以进行内存共享。一个示例是具有使用同一组 Java EE 类的多个 JVM 进程。当这些通用类被加载和使用时,可能会创建新的符号和字符串并添加到 JVM 的内部“符号”和“字符串”表中。在运行时,从存档文件映射的符号或字符串对象可以在多个 JVM 进程之间共享,从而减少总体内存使用量。此外,存档字符串还可以在启动时间和运行时执行方面提供额外的性能优势。
在 JDK 10 及更高版本中,存档类中的 CONSTANT_String 条目在转储时解析为内部字符串对象,并且所有内部字符串对象都被存档。但是,即使所有存档类中的所有 CONSTANT_String 字面量都被解析,添加不在类文件中的字符串字面量但可能在运行时由您的应用程序使用的其他字符串仍然可能是有益的。
符号数据应由附加到正在运行的 JVM 进程的 jcmd 工具生成。请参阅 jcmd
。
以下是 jcmd
中符号转储命令的示例
jcmd pid VM.symboltable -verbose
**注意:** 此 jcmd
输出的第一行(进程 ID)和第二行(@VERSION
...)应从配置文件中排除。
配置文件示例
以下是一个配置文件示例
VERSION: 1.0
@SECTION: Symbol
10 -1: linkMethod
在配置文件示例中,@SECTION
: Symbol 条目使用以下格式
length refcount: symbol
共享符号的 refcount
始终为 -1
。@SECTION
指定其后部分的类型。部分中的所有数据必须与 @SECTION
指定的类型相同。不允许混合不同类型的数据。允许在一个 shared_config_file 中使用多个由不同 @SECTION
指定的相同类型的分隔数据部分。
性能调整示例
您可以使用 Java 高级运行时选项来优化应用程序的性能。
针对更高吞吐量进行调整
使用以下命令和高级选项为您的应用程序实现更高的吞吐量性能
java -server -XX:+UseParallelGC -XX:+UseLargePages -Xmn10g -Xms26g -Xmx26g
针对更短的响应时间进行调整
使用以下命令和高级选项为您的应用程序实现更短的响应时间
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100
保持 Java 堆大小较小并减少嵌入式应用程序的动态占用空间
使用以下高级运行时选项来保持 Java 堆大小较小并减少嵌入式应用程序的动态占用空间
-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5
**注意:** 这两个选项的默认值分别为 70% 和 40%。由于使用这些较小的设置可能会导致性能下降,因此您应该通过尽可能减少这些设置来优化较小的占用空间,而不会引入不可接受的性能下降。
退出状态
当启动器使用错误的参数、严重错误或 JVM 引发的异常调用启动器时,启动器通常会返回以下退出值。但是,Java 应用程序可以选择使用 API 调用 System.exit(exitValue)
返回任何值。这些值是
0: Successful completion
>0: An error occurred
上次更新: 2021 年 9 月 14 日