java命令

java命令

名称

java-启动Java应用程序

概要

要启动类文件:

javaoptions ] mainclass [ args ...]

要在JAR文件中启动主类:

java[选项-jar jarfile [ args ...]

要在模块中启动主类:

javaoptions ]-m 模块/mainclass ] [ args ...]

要么

javaoptions ]--module 模块/mainclass ] [ args ...]

要启动一个源文件程序:

javaoptions ]源文件args ...]

选项
可选:指定命令行选项,以空格分隔。有关可用选项的描述,请参见Java选项概述
主类
指定要启动的类的名称。以下命令行条目classname是main方法的参数。
-jar jar文件
执行封装在JAR文件中的程序。jar文件的说法是与包含在形成一条线的清单JAR文件的名称,Main-Class:类名定义与类public static void main(String[] args)充当应用程序的出发点法。使用时-jar,指定的JAR文件是所有用户类的源,而其他类路径设置将被忽略。如果您使用的是JAR文件,请参见jar
-m--module 模块/mainclass ]

如果给定了主类,则在mainclass指定的模块中执行主类;如果未给定,则执行module中的值换句话说,主类可以在模块未指定时使用,或者在指定时覆盖值。

请参阅Java的标准选项

源文件
仅用于启动单个源文件程序。使用源文件模式时,指定包含主类的源文件。请参见使用源文件模式启动单文件源代码程序
args ...
可选:mainclasssource-file-jar jarfile-m--module 模块/mainclass之后的参数作为参数传递给主类。

描述

java命令启动Java应用程序。它通过启动Java虚拟机(JVM),加载指定的类并调用该类的main()方法来实现。必须声明的方法publicstatic,它必须不返回任何值,并且它必须接受一个String数组作为参数。方法声明具有以下形式:

public static void main(String[] args)

在源文件模式下,该java命令可以启动在源文件中声明的类。有关使用源文件模式的说明,请参见使用源文件模式启动单文件源代码程序

注意:您可以使用JDK_JAVA_OPTIONS启动器环境变量将其内容放在java启动器的实际命令行之前请参见使用JDK_JAVA_OPTIONS启动器环境变量

默认情况下,不是java命令选项的第一个参数是要调用的类的完全限定名称。如果-jar指定,则其参数为包含应用程序类和资源文件的JAR文件的名称。启动类必须由Main-Class清单文件中清单标题指示

类文件名或JAR文件名之后的参数将传递给该main()方法。

javaw

Windows:javaw命令与相同java,但javaw没有关联的控制台窗口。使用javaw时,你不想要一个命令提示符窗口出现。javaw发射器将,但是,如果启动失败显示错误信息的对话框。

使用源文件模式启动单文件源代码程序

要启动在源文件中声明的类,请java在源文件模式下运行启动器。进入源文件模式由java命令行上的两个项目确定

  • 命令行中不是选项或选项一部分的第一项。换句话说,命令行中的项目否则将是主类名称。

  • --source 版本的选项,如果存在的话。

如果该类标识具有.java扩展名的现有文件,或者--source指定选项,则将选择源文件模式。然后,将编译并运行源文件。--source选项可用于指定源版本源代码的N。这确定了可以使用的API。设置--source N时,只能使用JDK N中定义的公共API 

注意:对于每个发行版,N的有效值都会更改,并会添加新值和删除旧值。如果使用不再支持N值,则会收到一条错误消息的支持的值Ñ此版本是78910111213,和14

如果文件没有.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,和这些选项中的任何变异形式。它还包含--enable-previewJEP 12中描述的新选项。

  • 没有规定将任何其他选项传递给编译器,例如-processor-Werror

  • 命令行参数文件(@-files)可以按标准方式使用。通过为文件名加上@字符前缀,可以在命令行上指定的文件中放置用于VM或正在调用的程序的一长串参数

在源文件模式下,编译过程如下:

  • 任何与编译环境相关的命令行选项都将被考虑在内。

  • 找不到和编译其他源文件,就好像源路径设置为空值一样。

  • 注释处理被禁用,好像-proc:none生效了一样。

  • 如果通过--source选项指定了版本,则该值将用作--release编译隐式选项的参数这将设置编译器接受的源版本以及源文件中的代码可能使用的系统API。

  • 源文件是在未命名模块的上下文中编译的。

  • 源文件应包含一个或多个顶级类,其中第一个作为要执行的类。

  • 编译器没有强制执行JLS 7.6末尾定义的可选限制,即命名包中的类型应该存在于名称由类型名称和.java扩展名组成的文件中

  • 如果源文件包含错误,则将适当的错误消息写入标准错误流,并且启动程序以非零退出代码退出。

在源文件模式下,执行过程如下:

  • 要执行的类是在源文件中找到的第一个顶级类。它必须包含标准public static void main(String[])方法的声明

  • 编译的类由定制类加载器加载,该类加载器委托给应用程序类加载器。这意味着出现在应用程序类路径上的类不能引用源文件中声明的任何类。

  • 编译后的类在未命名模块的上下文中执行,就好像--add-modules=ALL-DEFAULT生效了一样。这是在--add-module命令行上可能已指定的任何其他选项的补充

  • 命令行中文件名之后出现的所有参数都以明显的方式传递给标准main方法。

  • 如果应用程序类路径上有一个与要执行的类名称相同的类,则会出错。

有关完整的详细信息,请参见JEP 330:启动单文件源代码程序

使用JDK_JAVA_OPTIONS启动器环境变量

JDK_JAVA_OPTIONS将其内容添加到从命令行解析的选项中。JDK_JAVA_OPTIONS环境变量的内容是由空格字符分隔的参数列表(由决定isspace())。这些在传递给java启动器的命令行参数之前环境变量的编码要求java与系统上的命令行相同JDK_JAVA_OPTIONS处理环境变量内容的方式与在命令行中指定的方式相同。

引号')或双"引号)可以用于包围包含空格字符的参数。只需删除一对引号,即可保留开引号和第一个匹配的闭引号之间的所有内容。如果找不到匹配的报价,启动器将中止并显示错误消息。@支持-files,因为它们在命令行中指定。但是,与@-files一样,不支持使用通配符。为了减轻潜在的滥用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

布尔选项用于启用默认情况下禁用的功能或禁用默认情况下启用的功能。此类选项不需要参数。-XX使用加号(-XX:+OptionName启用布尔选项,使用减号(-XX:-OptionName禁用布尔选项

对于需要参数的选项,参数可以用空格,冒号(:)或等号(=)与选项名称分隔,或者参数可以直接跟在选项后面(每个选项的确切语法不同) )。如果你希望指定字节大小,那么你可以使用任何后缀,或者使用后缀kK千字节(KB),mM兆字节(MB),或gG千兆字节(GB)。例如,设置大小为8 GB,您可以指定8g8192m8388608k,或8589934592作为参数。如果希望指定百分比,则使用0到1之间的数字。例如,指定0.2525%。

以下各节描述了已过时,不建议使用和删除的选项:

Java的标准选项

这些是JVM的所有实现所支持的最常用选项。

注意:要为长选项指定参数,可以使用--name=--name value

-agentlib:libname [=选项]

加载指定的本机代理程序库。库名称后,可以使用逗号分隔的特定于该库的选项列表。

  • Oracle Solaris,Linux和macOS:如果-agentlib:foo指定了该选项,那么JVM会尝试加载libfoo.soLD_LIBRARY_PATH系统变量指定的位置中命名的库(在macOS上,此变量为DYLD_LIBRARY_PATH)。

  • Windows:如果-agentlib:foo指定了该选项,则JVM尝试加载foo.dllPATH系统变量指定的位置中命名的库

    下面的示例演示如何加载Java调试线协议(JDWP)库并侦听端口8000上的套接字连接,从而在加载主类之前挂起JVM:

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

-agentpath:路径名[=选项]
加载由绝对路径名指定的本机代理程序库。此选项等效于-agentlib但使用库的完整路径和文件名。
--class-path classpath-classpath classpath-cp classpath

分号(;)分隔的目录,JAR档案,ZIP压缩文件的列表中搜索类文件。

指定的类路径覆盖的任何设置CLASSPATH环境变量。如果未使用的类路径选项和类路径没有被设置,则用户类路径由当前目录的(。)。

作为一种特殊的方便,包含星号(*)被认为等同于指定在扩展目录下的所有文件列表的基本名称的类路径元素.jar.JARJava程序无法区分两个调用之间的区别。例如,如果目录MYDIR包含a.jarb.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 模块[,模块...]
除了初始模块外,还指定要解析的根模块。模块还可以是ALL-DEFAULTALL-SYSTEM,和ALL-MODULE-PATH
--list-modules
列出可观察的模块,然后退出。
-d MODULE_NAME--describe-module MODULE_NAME
描述指定的模块,然后退出。
--dry-run
创建VM,但不执行main方法。--dry-run选项对于验证命令行选项(例如模块系统配置)可能很有用。
--validate-modules
验证所有模块并退出。此选项有助于查找模块路径上的模块的冲突和其他错误。
-D属性=
设置系统属性值。属性变量是没有空格表示属性的名称的字符串。变量是表示属性的值的字符串。如果value是带空格的字符串,则将其括在引号中(例如-Dfoo="foo bar")。
-disableassertions:[包名] ... | :类名]或-da:[包名] ... | :类名]

禁用断言。默认情况下,所有包和类都禁用断言。不带参数的-disableassertions-da)禁用所有程序包和类中的断言。packagename参数以结尾的情况下...,此开关将禁用指定程序包和任何子程序包中的断言。如果参数为simple ...,则该开关将禁用当前工作目录中未命名包中的断言。使用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:[包名] ... | :类名]或-ea:[包名] ... | :类名]

启用断言。默认情况下,所有包和类都禁用断言。没有参数,-enableassertions-ea)启用所有包和类中的断言。packagename参数以结尾的情况下...,此开关将在指定的包和任何子包中启用断言。如果参数为simple ...,那么该开关将在当前工作目录的未命名包中启用断言。使用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 [=选项]
加载指定的Java编程语言代理。请参阅java.lang.instrument
--show-version
将产品版本打印到输出流并继续。
-showversion
将产品版本打印到错误流,然后继续。
--show-module-resolution
显示启动期间输出的模块分辨率。
-splash:图像路径

显示初始屏幕,其中包含imagepath指定的图像系统会自动支持和使用HiDPI缩放图像。未缩放的图像文件名,例如image.ext,应始终作为参数传递的-splash选项。提供的最合适的缩放图像将被自动拾取。

例如,要在启动应用程序时显示目录中splash.gif文件images,请使用以下选项:

-splash:images/splash.gif

有关更多信息,请参见SplashScreen API文档。

-verbose:class
显示有关每个已加载类的信息。
-verbose:gc
显示有关每个垃圾收集(GC)事件的信息。
-verbose:jni
显示有关使用本机方法和其他Java本机接口(JNI)活动的信息。
-verbose:module
显示有关正在使用的模块的信息。
--version
将产品版本打印到输出流并退出。
-version
将产品版本打印到错误流并退出。
-X
将有关其他选项的帮助输出到错误流。
--help-extra
将有关其他选项的帮助输出到输出流。
@argfile

指定一个或多个前缀参数文件@由所使用的java命令。这并非罕见的java命令行是因为很长.jar的类路径所需的文件。所述@argfile通过启用启动程序选项克服了命令行长度限制扩大的参数文件的内容壳膨胀之后,但参数处理之前。参数文件中的内容将被扩展,因为否则将在命令行上指定它们,直到--disable-@files遇到选项为止

参数文件还可以包含主类名称和所有选项。如果参数文件包含java命令所需的所有选项,那么命令行可以简单地是:

java @argfile

有关使用-argfiles的描述和示例,请参见java命令行参数文件@

Java的其他选项

下列java选项是特定的Java HotSpot虚拟机通用选项。

-Xbatch
禁用后台编译。默认情况下,JVM将方法编译为后台任务,以解释器模式运行该方法,直到后台编译完成。-Xbatch标志禁用后台编译,以便所有方法的编译都作为前台任务进行,直到完成。此选项等效于-XX:-BackgroundCompilation
-Xbootclasspath/a:目录拉链JAR文件

指定目录,JAR文件和ZIP存档的列表,以附加到默认引导程序类路径的末尾。

Oracle Solaris,Linux和macOS::此列表中的冒号()分隔实体。

Windows:;此列表中的分号()分隔实体。

-Xcheck:jni
对Java本机接口(JNI)功能执行其他检查。具体来说,它将在处理JNI请求之前验证传递给JNI函数的参数和运行时环境数据。它还检查JNI调用之间的未决异常。遇到的任何无效数据都表明本机代码存在问题,在这种情况下,JVM终止并发生了不可恢复的错误。使用此选项时,性能会下降。
-Xdebug
什么也没做。提供向后兼容性。
-Xdiag
显示其他诊断消息。
-Xint
以仅解释模式运行应用程序。禁止对本机代码进行编译,并且所有字节码均由解释器执行。即时(JIT)编译器提供的性能优势在此模式下不存在。
-Xinternalversion
显示比该-version选项更详细的JVM版本信息,然后退出。
-Xlog:选项
使用Java虚拟机(JVM)统一日志记录框架配置或启用日志记录。请参阅使用JVM统一日志记录框架启用日志记录
-Xmixed
由解释器执行所有字节码,但热方法除外,后者被编译为本机代码。默认为开。用于-Xint关闭。
-Xmn 尺寸

设置世代收集器中年轻一代(苗圃)的堆的初始大小和最大大小(以字节为单位)。附加字母kK表示千字节,mM表示兆字节,gG表示千兆字节。堆的年轻代区域用于新对象。与其他区域相比,在该区域执行GC的频率更高。如果年轻一代的大小太小,则会执行大量次要垃圾回收。如果大小太大,则仅执行完整的垃圾回收,这可能需要很长时间才能完成。建议您不要为G1收集器设置年轻代的大小,并保持年轻代的大小大于其他收集器总堆大小的25%且小于50%。以下示例显示如何使用各种单位将年轻一代的初始大小和最大大小设置为256 MB:

-Xmn256m
-Xmn262144k
-Xmn268435456

取而代之的是的-Xmn选项组中的两个堆年轻一代的初始和最大大小,您可以使用-XX:NewSize设置初始大小和-XX:MaxNewSize设置的最大尺寸。

-Xms 尺寸

设置堆的最小和初始大小(以字节为单位)。此值必须是1024的倍数且大于1 MB。追加字母kK表示千字节,mM表示兆字节,gG表示千兆字节。以下示例说明如何使用各种单位将分配的内存大小设置为6 MB:

-Xms6291456
-Xms6144k
-Xms6m

-Xms可以-XX:MinHeapSize选择设置最小大小和-XX:InitialHeapSize设置初始大小,而不是设置堆的最小和初始大小选项

如果未设置此选项,则将初始大小设置为为老一代和年轻一代分配的大小之和。可以使用-Xmn选项或-XX:NewSize选项设置年轻代的堆的初始大小

-Xmx 尺寸

指定堆的最大大小(以字节为单位)。此值必须是1024的倍数且大于2 MB。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值是在运行时根据系统配置选择的。对于服务器部署,-Xms-Xmx经常设置为相同的值。下面的示例演示如何使用各种单位将分配的最大内存大小设置为80 MB:

-Xmx83886080
-Xmx81920k
-Xmx80m

-Xmx选项等效于-XX:MaxHeapSize

-Xnoclassgc
禁用类的垃圾收集(GC)。这样可以节省一些GC时间,从而缩短了应用程序运行期间的中断时间。-Xnoclassgc在启动时指定时,应用程序中的类对象在GC期间保持不变,并且始终被认为是活动的。这可能导致更多的内存被永久占用,如果不谨慎使用,将引发内存不足的异常。
-Xrs

减少JVM对操作系统信号的使用。即使JVM突然终止,关闭挂钩也可以通过在关闭时运行用户清除代码(例如关闭数据库连接)来有序关闭Java应用程序。

  • Oracle Solaris,Linux和macOS:

    • JVM捕获信号以实现意外异常终止的关闭挂钩。JVM使用SIGHUPSIGINT以及SIGTERM启动关闭挂钩的运行。

    • 应用程序中嵌入的JVM经常需要陷阱信号如SIGINTSIGTERM,这可导致与JVM信号处理程序干扰。-Xrs选项可用来解决这一问题。-Xrs被使用时,信号掩模SIGINTSIGTERMSIGHUP,和SIGQUIT不被JVM改变,并且没有安装这些信号信号处理程序。

  • 视窗:

    • JVM监视控制台控制事件,以实现用于异常终止的关闭挂钩。具体而言,JVM将注册开始关闭的挂机处理,并返回一个控制台控制处理程序TRUE用于CTRL_C_EVENTCTRL_CLOSE_EVENTCTRL_LOGOFF_EVENT,和CTRL_SHUTDOWN_EVENT

    • JVM使用类似的机制来实现转储线程堆栈的功能,以进行调试。JVM用于CTRL_BREAK_EVENT执行线程转储。

    • 如果JVM作为服务运行(例如,作为Web服务器的servlet引擎),则它可以接收CTRL_LOGOFF_EVENT但不应启动关闭,因为操作系统实际上并未终止该进程。为了避免此类干扰,-Xrs可以使用选项。-Xrs使用选项时,JVM不会安装一个控制台控制处理程序,这意味着它不留意或过程CTRL_C_EVENTCTRL_CLOSE_EVENTCTRL_LOGOFF_EVENT,或CTRL_SHUTDOWN_EVENT

指定有两个结果-Xrs

  • Oracle Solaris,Linux和macOS: SIGQUIT线程转储不可用。

  • Windows: Ctrl + Break线程转储不可用。

用户代码负责导致运行关闭挂钩,例如,通过System.exit()在终止JVM时调用

-Xshare:模式

设置类数据共享(CDS)模式。

此选项的可能模式参数包括:

auto
如果可能,使用共享的类数据(默认)。
on
需要使用共享的类数据,否则将失败。

注意:-Xshare:on选项仅用于测试目的,并且由于操作系统使用地址空间布局随机化而可能导致间歇性故障。此选项不应在生产环境中使用。

off
不要尝试使用共享的类数据。
-XshowSettings
显示所有设置,然后继续。
-XshowSettings:类别

显示设置并继续。此选项的可能类别参数包括以下内容:

all
显示所有类别的设置。这是默认值。
locale
显示与语言环境相关的设置。
properties
显示与系统属性有关的设置。
vm
显示JVM的设置。
system
Linux:显示主机系统或容器配置,然后继续。
-Xss 尺寸

设置线程堆栈大小(以字节为单位)。附加字母kK表示KB,mM表示MB,或gG表示GB。默认值取决于平台:

  • Linux / x64(64位):1024 KB

  • macOS(64位):1024 KB

  • Oracle Solaris(64位):1024 KB

  • Windows:默认值取决于虚拟内存

下面的示例以不同的单位将线程堆栈大小设置为1024 KB:

-Xss1m
-Xss1024k
-Xss1048576

此选项类似于-XX:ThreadStackSize

--add-reads 模块=目标模块,target-module)*
不管模块声明如何,更新模块以读取target-module目标模块可以全部未命名,以读取所有未命名的模块。
--add-exports 模块/=target-module,target-module)*
更新模块以将导出target-module,而不管模块声明如何。目标模块可以将所有未命名的导出到所有未命名的模块。
--add-opens 模块/=target-module,target-module)*
更新模块以开目标模块,无论模块声明的。
--illegal-access=参数

如果在运行时出现,--illegal-access=则使用关键字参数来指定操作模式:

注意:此选项将在以后的版本中删除。

  • permit:如果在JDK 8中存在该程序包,则此模式将打开运行时映像中每个模块中的每个程序包以对所有未命名的模块进行编码(例如,类路径中的代码)。这将启用两个静态访问(例如,通过编译的字节码,以及通过平台的各种反射API进行的深度反射访问)。对任何此类包装的第一次反射式访问操作都会发出警告。但是,第一次出现后不会发出警告。此单个警告描述了如何启用进一步的警告。该模式是当前JDK的默认模式,但在将来的版本中会更改。

  • warnpermit除了对每个非法的反射访问操作都会发出警告消息外,此模式与其他模式相同

  • debugwarn除了为每个非法的反射访问操作都发出警告消息和堆栈跟踪信息外,此模式与其他模式相同

  • deny:此模式将禁用所有其他非法访问操作,但其他命令行选项启用的操作除外--add-opens在将来的版本中,此模式将成为默认模式。

默认模式--illegal-access=permit旨在使您了解类路径上的代码,这些代码至少可以一次反射地访问任何JDK内部API。要了解所有此类访问,可以使用warndebug模式。对于类路径上需要非法访问的每个库或框架,您有两种选择:

  • 如果组件的维护者已经发布了不再使用JDK内部API的固定版本,则可以考虑升级到该版本。

  • 如果仍然需要修复该组件,则可以联系其维护者,并要求他们使用适当的导出API替换其对JDK内部API的使用。

如果必须继续使用需要非法访问的组件,则可以通过使用一个或多个--add-opens选项仅打开那些需要访问权限的内部软件包来消除警告消息

要验证您的应用程序已准备好用于将来的JDK版本,请--illegal-access=deny与所有必要--add-opens选项一起运行它任何剩余的非法访问错误很可能是由于从编译代码到JDK内部API的静态引用所致。您可以通过使用该选项运行jdeps工具来识别那些--jdk-internals出于性能原因,当前的JDK不会针对非法的静态访问操作发出警告。

--limit-modules 模块[,模块...]
指定可观察模块范围的限制。
--patch-module 模块=文件;file)*
使用JAR文件或目录中的类和资源覆盖或扩展模块。
--source 
在源文件模式下设置源版本。

macOS的其他选项

以下额外选项是特定于macOS的。

-XstartOnFirstThread
main()在第一个(AppKit)线程上运行方法。
-Xdock:name=应用名称
覆盖显示在扩展坞中的默认应用程序名称。
-Xdock:icon=path_to_icon_file
覆盖停靠栏中显示的默认图标。

Java的高级选项

这些java选项可用于启用其他高级选项。

-XX:+UnlockDiagnosticVMOptions

解锁用于诊断JVM的选项。默认情况下,此选项是禁用的,诊断选项不可用。

不支持使用此选项启用的命令行选项。如果在使用这些选项中的任何一个时遇到问题,则很可能需要在不使用这些不受支持的任何选项的情况下重现问题,然后Oracle支持部门才能协助进行调查。也有可能在没有任何警告的情况下删除了这些选项中的任何一个或更改了它们的行为。

-XX:+UnlockExperimentalVMOptions
解锁提供JVM中实验功能的选项。默认情况下,此选项处于禁用状态,并且实验性功能不可用。

Java的高级运行时选项

这些java选项控制Java HotSpot VM的运行时行为。

-XX:ActiveProcessorCount=X

覆盖VM用于计算其用于各种操作(例如垃圾收集和ForkJoinPool)的线程池大小的CPU数。

VM通常从操作系统确定可用处理器的数量。在docker容器中运行多个Java进程时,此标志对于分区CPU资源很有用。即使UseContainerSupport未启用,也会保留此标志请参阅-XX:-UseContainerSupport,以获取有关启用和禁用容器支持的说明。

-XX:AllocateHeapAt=路径

采取文件系统路径,并使用内存映射在存储设备上分配对象堆。使用此选项,HotSpot VM可以在用户指定的备用存储设备(例如NV-DIMM)上分配Java对象堆。

在不更改现有应用程序代码的情况下,可以将具有与DRAM相同的语义(包括原子操作的语义)的替代存储设备(而不是DRAM)用于对象堆。所有其他内存结构(例如代码堆,元空间和线程堆栈)继续驻留在DRAM中。

某些操作系统通过文件系统公开非DRAM内存。这些文件系统中的内存映射文件绕过了页面缓存,并提供了虚拟内存到设备上物理内存的直接映射。现有的与堆相关的标志(例如-Xmx-Xms)和与垃圾回收相关的标志继续像以前一样工作。

-XX:-CompactStrings

禁用紧凑字符串功能。默认情况下,启用此选项。启用此选项后,内部仅包含单字节字符的Java字符串将使用ISO-8859-1 / Latin-1编码在内部表示并存储为每个字符的单字节字符串。这将只包含单字节字符的字符串减少了50%的空间。对于包含至少一个多字节字符的Java字符串:这些字符串使用UTF-16编码表示并存储为每个字符2个字节。禁用紧凑字符串功能将强制使用UTF-16编码作为所有Java字符串的内部表示。

禁用紧凑字符串可能有益的情况包括:

  • 当知道应用程序将大量分配多字节字符字符串时

  • 在从Java SE 8到Java SE 9的迁移中观察到性能下降的意外事件中,分析表明Compact Strings引入了回归

在这两种情况下,禁用紧凑字符串都是有意义的。

-XX:ErrorFile=文件名

指定发生不可恢复的错误时将错误数据写入的路径和文件名。默认情况下,此文件在当前工作目录中创建,并命名为hs_err_pidpid.log,其中pid是遇到错误的进程的标识符。

以下示例显示了如何设置默认日志文件(请注意,该进程的标识符指定为%p):

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

  • Oracle Solaris,Linux和macOS:以下示例显示如何将错误日志设置为/var/log/java/java_error.log

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

  • Windows:以下示例显示了如何将错误日志文件设置为C:/log/java/java_error.log

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

如果该文件存在且可写,则它将被覆盖。否则,如果由于空间不足,权限问题或其他问题而无法在指定目录中创建文件,则在操作系统的临时目录中创建文件:

  • Oracle Solaris,Linux和macOS:临时目录为/tmp

  • Windows:临时目录由TMP环境变量的值指定如果未定义该TEMP环境变量,则使用环境变量的值

-XX:+ExtensiveErrorReports
允许在中报告更广泛的错误信息ErrorFile可以在需要最大信息的环境中打开此选项-即使生成的日志可能非常大和/或包含可能被视为敏感的信息。各个发行版之间以及跨不同平台的信息可能会有所不同。默认情况下,此选项是禁用的。
-XX:FlightRecorderOptions=参数=(或)
-XX:FlightRecorderOptions:参数=

设置控制JFR行为的参数。

以下列表包含可用的JFR参数=条目:

globalbuffersize=尺寸
指定用于数据保留的主内存总量。默认值基于为指定的值memorysize更改memorysize参数以更改全局缓冲区的大小。
maxchunksize=尺寸
指定记录中数据块的最大大小(以字节为单位)。追加mM以兆字节(MB)为单位指定大小,g或者G以千兆字节(GB)为单位指定大小。默认情况下,数据块的最大大小设置为12 MB。允许的最小值是1 MB。
memorysize=尺寸
确定应使用多少缓冲存储器,并根据指定的大小设置globalbuffersizenumglobalbuffers参数。追加mM以兆字节(MB)为单位指定大小,g或者G以千兆字节(GB)为单位指定大小。默认情况下,内存大小设置为10 MB。
numglobalbuffers
指定使用的全局缓冲区数。默认值基于指定的内存大小。更改memorysize参数以更改全局缓冲区的数量。
old-object-queue-size=number-of-objects
跟踪的最大旧对象数。默认情况下,对象数设置为256。
repository=路径
指定用于临时磁盘存储的存储库(目录)。默认情况下,使用系统的临时目录。
retransform=truefalse}
指定是否应使用JVMTI重新转换事件类。如果为false,则在加载事件类时添加检测。默认情况下,启用此参数。
samplethreads=truefalse}
指定是否启用线程采样。仅在与该参数一起启用采样事件的情况下,才会进行线程采样。默认情况下,启用此参数。
stackdepth=深度
堆栈跟踪的堆栈深度。默认情况下,深度设置为64个方法调用。最大值为2048。大于64的值可能会导致大量开销并降低性能。
threadbuffersize=尺寸
指定每个线程的本地缓冲区大小(以字节为单位)。默认情况下,本地缓冲区大小设置为8 KB,最小值为4 KB。覆盖此参数可能会降低性能,因此不建议这样做。

您可以通过用逗号分隔多个参数来指定它们的值。

-XX:LargePageSizeInBytes=尺寸

设置用于Java堆的大页面的最大大小(以字节为单位)。尺寸参数必须是2的幂(2,4,8,16,等等)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认情况下,大小设置为0,这意味着JVM自动为大页面选择大小。参见大页面

下面的示例描述了如何将大页面大小设置为4兆字节(MB):

-XX:LargePageSizeInBytes=4m

-XX:MaxDirectMemorySize=尺寸

设置java.nio程序包直接缓冲区分配的最大总大小(以字节为单位)追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认情况下,大小设置为0,这意味着JVM自动为NIO直接缓冲区分配选择大小。

以下示例说明了如何以不同单位将NIO大小设置为1024 KB:

-XX:MaxDirectMemorySize=1m
-XX:MaxDirectMemorySize=1024k
-XX:MaxDirectMemorySize=1048576
-XX:-MaxFDLimit
禁止将打开文件描述符的软限制设置为硬限制的尝试。默认情况下,此选项在所有平台上均已启用,但在Windows上将被忽略。您唯一需要禁用此功能的时间是在Mac OS上,Mac OS最多使用10240,这比实际的系统最大值要低。
-XX:NativeMemoryTracking=模式

指定用于跟踪JVM本机内存使用情况的模式。此选项的可能模式参数包括:

off
指示不跟踪JVM本机内存使用情况。如果不指定该-XX:NativeMemoryTracking选项,则这是默认行为
summary
仅跟踪JVM子系统(例如Java堆,类,代码和线程)的内存使用情况。
detail
除了跟踪JVM子系统的内存使用情况之外,还跟踪单个CallSite,单个虚拟内存区域及其提交的区域的内存使用情况
-XX:ObjectAlignmentInBytes=对准

设置Java对象的内存对齐方式(以字节为单位)。默认情况下,该值设置为8个字节。指定的值应为2的幂,并且必须在8到256(含)范围内。使用此选项,可以使用Java堆大小较大的压缩指针。

堆大小限制(以字节为单位)计算如下:

4GB * ObjectAlignmentInBytes

注意:随着对齐值增加,对象之间未使用的空间也会增加。因此,使用Java堆大小较大的压缩指针可能不会带来任何好处。

-XX:OnError=

设置在发生不可恢复的错误时运行的自定义命令或一系列用分号分隔的命令。如果字符串包含空格,则必须将其用引号引起来。

  • Oracle Solaris,Linux和macOS:以下示例显示了如何使用该-XX:OnError选项来运行gcore命令以创建核心映像,并gdb在出现不可恢复的错误时启动调试器以附加到进程(%p指定当前进程标识符) ):

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

  • Windows:以下示例显示了在发生无法恢复的错误(指定当前进程标识符)的情况下,如何使用该-XX:OnError选项运行userdump.exe实用程序以获取故障转储%p本示例假定userdump.exePATH环境变量中指定实用程序的路径

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

-XX:OnOutOfMemoryError=
设置自定义命令或一系列用分号分隔的命令,以在OutOfMemoryError首次引发异常时运行如果字符串包含空格,则必须将其用引号引起来。有关命令字符串的示例,请参见该-XX:OnError选项的描述
-XX:+PrintCommandLineFlags
启用打印按人体工程学选择的出现在命令行中的JVM标志。了解JVM设置的人体工程学值(例如堆空间大小和选定的垃圾收集器)可能会很有用。默认情况下,此选项为禁用状态,并且不打印标志。
-XX:+PreserveFramePointer
在使用RBP寄存器作为通用寄存器(-XX:-PreserveFramePointer)和使用RBP寄存器保存当前执行方法-XX:+PreserveFramePointer的帧指针。)之间进行选择,如果帧指针可用,则可以使用外部性能分析工具(例如Linux perf)更准确的堆栈跟踪。
-XX:+PrintNMTStatistics
启用本机内存跟踪时,启用在JVM出口打印收集的本机内存跟踪数据(请参阅参考资料-XX:NativeMemoryTracking)。默认情况下,此选项为禁用状态,并且不打印本机内存跟踪数据。
-XX:SharedArchiveFile=路径

指定类数据共享(CDS)存档文件的路径和名称

请参阅应用程序类数据共享

-XX:SharedArchiveConfigFileshared_config_file
指定添加到存档文件的其他共享数据。
-XX:SharedClassListFile=文件名

指定文本文件,该文件包含要存储在类数据共享(CDS)归档文件中的类的名称。该文件每行包含一个类的全名,斜杠(/)代替点(.)除外。例如,要指定类java.lang.Objecthello.Main,请创建一个包含以下两行的文本文件:

java/lang/Object
hello/Main

您在此文本文件中指定的类应包括应用程序常用的类。它们可以包括来自应用程序,扩展或引导程序类路径的任何类。

请参阅应用程序类数据共享

-XX:+ShowCodeDetailsInExceptionMessages
启用打印改进的NullPointerException消息。当应用程序抛出时NullPointerException,该选项使JVM能够分析程序的字节码指令,以准确确定哪个引用是null,并使用空详细信息描述源。零细节消息由计算并返回NullPointerException.getMessage(),并将与方法,文件名和行号一起作为异常消息打印出来。默认情况下,此选项是禁用的。
-XX:+ShowMessageBoxOnError
当JVM遇到不可恢复的错误时,启用对话框的显示。这样可以防止JVM退出并使进程保持活动状态,以便您可以在其上附加调试器以调查错误原因。默认情况下,此选项是禁用的。
-XX:StartFlightRecording=参数=

启动Java应用程序的JFR记录。此选项等效于JFR.start在运行时启动记录诊断命令。开始JFR记录时,可以设置以下参数=条目:

delay=时间
指定Java应用程序启动时间与记录开始之间的延迟。追加s以秒,m分钟,h小时或d天为单位指定时间(例如,指定10m为10分钟)。默认情况下,没有延迟,并且此参数设置为0。
disk=truefalse}
指定是否在记录时将数据写入磁盘。默认情况下,启用此参数。
dumponexit=truefalse}
指定在JVM关闭时是否转储正在运行的记录。如果启用并且filename未输入a,则将记录写入启动过程的目录中的文件中。文件名是系统生成的名称,类似于,包含进程ID,记录ID和当前时间戳hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr默认情况下,禁用此参数。
duration=时间
指定记录的持续时间。追加s以秒,m分钟,h小时或d天为单位指定时间(例如,指定5h表示5个小时)。默认情况下,持续时间不受限制,并且此参数设置为0。
filename=路径

指定停止录制时将录制内容写入的文件的路径和名称,例如:

  • recording.jfr
  • /home/user/recordings/recording.jfr
  • c:\recordings\recording.jfr
name=识别码
同时获取记录的名称和标识符。
maxage=时间
指定要保留用于记录的磁盘数据的最长期限。仅当disk参数设置为时,此参数才有效true追加s以秒,m分钟,h小时或d天为30s单位指定时间(例如,指定为30秒)。默认情况下,最大年龄不受限制,并且此参数设置为0s
maxsize=尺寸
指定要保留用于记录的磁盘数据的最大大小(以字节为单位)。仅当disk参数设置为时,此参数才有效true该值不得小于使用maxchunksize设置参数的值-XX:FlightRecorderOptions追加mM指定以MB为单位的大小,或者g或者G指定千兆字节大小。默认情况下,磁盘数据的最大大小不受限制,并且此参数设置为0
path-to-gc-roots=truefalse}

指定是否在记录结束时收集到垃圾回收(GC)根的路径。默认情况下,禁用此参数。

GC根目录的路径对于查找内存泄漏很有用,但是收集它很耗时。仅当您为怀疑有内存泄漏的应用程序开始录制时才启用此选项。如果settings参数设置为profile,则从中分配潜在泄漏对象的堆栈跟踪信息将包括在收集的信息中。

settings=路径

指定事件设置文件(JFC类型)的路径和名称。默认情况下,使用的default.jfc文件JRE_HOME/lib/jfr此默认设置文件以较低的开销收集了一组预定义的信息,因此对性能的影响最小,可与连续运行的记录一起使用。

还提供了第二个设置文件profile.jfc,该文件提供的数据比默认配置多,但可能会有更多开销和影响性能。需要更多信息时,请在短时间内使用此配置。

您可以通过用逗号分隔多个参数来指定它们的值。

-XX:ThreadStackSize=尺寸

设置Java线程堆栈的大小(以千字节为单位)。使用缩放后缀(例如k)会导致缩放千字节值,从而-XX:ThreadStackSize=1k将Java线程堆栈大小设置为1024 * 1024字节或1兆字节。默认值取决于平台:

  • Linux / x64(64位):1024 KB

  • macOS(64位):1024 KB

  • Oracle Solaris(64位):1024 KB

  • Windows:默认值取决于虚拟内存

以下示例显示如何以不同单位将线程堆栈大小设置为1 MB:

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

此选项类似于-Xss

-XX:-UseBiasedLocking

禁用偏向锁定功能。启用此标志后,某些具有大量无竞争同步的应用程序可能会获得明显的加速,但是具有某些锁定模式的应用程序可能会出现速度下降的情况。

默认情况下,启用此选项。

-XX:-UseCompressedOops

禁用压缩指针的使用。默认情况下,启用此选项,并使用压缩的指针。这将自动将根据人体工程学确定的最大Java堆大小限制为压缩指针可以覆盖的最大内存量。默认情况下,此范围是32 GB。

启用压缩oops后,对象引用将表示为32位偏移量而不是64位指针,这通常在运行Java堆大小小于压缩oops指针范围的应用程序时提高性能。此选项仅适用于64位JVM。

可以使用Java堆大小大于32 GB的压缩指针。参见-XX:ObjectAlignmentInBytes选项。

-XX:-UseContainerSupport

VM现在提供自动容器检测支持,该支持使VM可以确定在Docker容器中运行的Java进程可用的内存量和处理器数量。它使用此信息来分配系统资源。该支持仅在Linux x64平台上可用。如果支持,则此标志的默认值为true,并且默认情况下启用容器支持。可以使用禁用它-XX:-UseContainerSupport

统一日志可用于帮助诊断与此支持相关的问题。

使用-Xlog:os+container=trace的集装箱信息最大记录。有关使用统一日志记录的描述,请参阅使用JVM统一日志记录框架启用日志记录。

-XX:+UseHugeTLBFS

仅限Linux:此选项等效于指定-XX:+UseLargePages默认情况下禁用此选项。保留内存时,此选项会预先预先分配所有大页面;因此,JVM无法动态地增加或缩小大页面内存区域;看看-XX:UseTransparentHugePages你是否想要这种行为。

参见大页面

-XX:+UseLargePages

启用大页面内存的使用。默认情况下,此选项是禁用的,并且不使用大页面内存。

参见大页面

-XX:+UseTransparentHugePages
仅限Linux:启用对可以动态增长或收缩的大页面的使用。默认情况下禁用此选项。当操作系统将其他页面移动到创建大页面时,透明大页面可能会遇到性能问题。此选项可供实验使用。
-XX:+AllowUserSignalHandlers
通过应用程序启用信号处理程序的安装。默认情况下,此选项为禁用状态,并且不允许应用程序安装信号处理程序。
-XX:VMOptionsFile=文件名
允许用户在文件中指定VM选项,例如java -XX:VMOptionsFile=/var/my_vm_options HelloWorld

Java的高级JIT编译器选项

这些java选项控制Java HotSpot VM执行的动态实时(JIT)编译。

-XX:AllocateInstancePrefetchLines=线

设置要在实例分配指针之前预取的行数。默认情况下,要预取的行数设置为1:

-XX:AllocateInstancePrefetchLines=1

-XX:AllocatePrefetchDistance=尺寸

设置对象分配的预取距离的大小(以字节为单位)。从最后分配的对象的地址开始,预取将要用新对象的值写入的内存直到该距离。每个Java线程都有自己的分配点。

负值表示根据平台选择预取距离。正值是要预取的字节。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值设置为-1。

下面的示例显示如何将预取距离设置为1024字节:

-XX:AllocatePrefetchDistance=1024

-XX:AllocatePrefetchInstr=指令

将预取指令设置为在分配指针之前进行预取。可能的值是0到3。这些值后面的实际说明取决于平台。默认情况下,预取指令设置为0:

-XX:AllocatePrefetchInstr=0

-XX:AllocatePrefetchLines=线

使用编译代码中生成的预取指令,设置在最后一次分配对象后要加载的缓存行数。如果最后分配的对象是实例,则默认值为1;如果它是数组,则默认值为3。

下面的示例显示如何将已加载的缓存行数设置为5:

-XX:AllocatePrefetchLines=5

-XX:AllocatePrefetchStepSize=尺寸

设置顺序预取指令的步长(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,gG表示千兆字节。默认情况下,步长设置为16个字节:

-XX:AllocatePrefetchStepSize=16

-XX:AllocatePrefetchStyle=风格

设置预取指令的生成代码样式。风格参数是从0至3的整数:

0
不要生成预取指令。
1
每次分配后执行预取指令。这是默认设置。
2
使用线程本地分配块(TLAB)水印指针来确定何时执行预取指令。
3
每条高速缓存行生成一条预取指令。
-XX:+BackgroundCompilation
启用后台编译。默认情况下启用此选项。要禁用后台编译,请指定-XX:-BackgroundCompilation(相当于指定-Xbatch)。
-XX:CICompilerCount=线程数

设置用于编译的编译器线程数。默认情况下,将根据可用于编译代码的CPU和内存的数量自动选择编译器线程的数量。下面的示例显示如何将线程数设置为2:

-XX:CICompilerCount=2

-XX:+UseDynamicNumberOfCompilerThreads
动态创建编译器线程,最高可达所指定的限制-XX:CICompilerCount默认情况下启用此选项。
-XX:CompileCommand=命令,方法[,选项]

指定要对方法执行命令例如,要从编译中排除该类方法,请使用以下命令:indexOf()String

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

请注意,将指定完整的类名,包括用斜杠(/分隔的所有软件包和子软件包为了简化剪切和粘贴操作,还可以使用-XX:+PrintCompilationand-XX:+LogCompilation选项生成的方法名称格式

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

如果指定的方法没有签名,则该命令将应用于具有指定名称的所有方法。但是,您也可以采用类文件格式指定方法的签名。在这种情况下,应将参数括在引号中,否则外壳将分号视为命令结尾。例如,如果要仅排除indexOf(String)方法以String进行编译,请使用以下命令:

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

您也可以使用星号(*)作为类和方法名称的通配符。例如,indexOf()要从编译中排除所有类中的所有方法,请使用以下命令:

-XX:CompileCommand=exclude,*.indexOf

逗号和句点是空格的别名,这使得通过外壳传递编译器命令更加容易。您可以通过-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编译选项传递给指定的方法,以代替最后一个参数(option)。编译选项设置在方法名称之后的末尾。例如,要启用方法BlockLayoutByFrequency选项,请使用以下命令:append()StringBuffer

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

您可以指定多个编译选项,以逗号或空格分隔。

print
在编译指定方法后打印生成的汇编代码。
quiet

指示不打印编译命令。默认情况下,将显示您使用该-XX:CompileCommand选项指定的命令例如,如果从编译中排除该类indexOf()方法String,则将以下内容输出到标准输出:

CompilerOracle: exclude java/lang/String.indexOf

您可以通过-XX:CompileCommand=quiet在其他选项之前指定该选项来抑制这种情况-XX:CompileCommand

-XX:CompileCommandFile=文件名

设置从中读取JIT编译器命令的文件。默认情况下,该.hotspot_compiler文件用于存储JIT编译器执行的命令。

命令文件中的每一行代表一个命令,一个类名和一个使用该命令的方法名。例如,以下行为该类toString()方法打印汇编代码String

print java/lang/String toString

如果您正在使用命令让JIT编译器对方法执行,则请参阅该-XX:CompileCommand选项。

-XX:CompilerDirectivesFile=文件

程序启动时将指令从文件添加到指令堆栈。请参阅编译器控制

-XX:CompilerDirectivesFile选项必须与-XX:UnlockDiagnosticVMOptions解锁诊断JVM选项选项一起使用

-XX:+CompilerDirectivesPrint

在程序启动时或添加新指令时输出指令堆栈。

-XX:+CompilerDirectivesPrint选项必须与-XX:UnlockDiagnosticVMOptions解锁诊断JVM选项选项一起使用

-XX:CompileOnly=方法

设置应限制编译的方法列表(以逗号分隔)。仅编译指定的方法。用完整的类名指定每个方法(包括程序包和子程序包)。例如,为了仅编译length()所述的方法String类和size()所述的方法List类,使用以下:

-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:CompileThresholdScaling=规模
提供对首次编译的统一控制。此选项控制何时首先为分层和非分层操作模式编译方法。CompileThresholdScaling选项的浮点值在0到+ Inf之间,并缩放与当前操作模式(分层和非分层)相对应的阈值。设置CompileThresholdScaling为小于1.0的值将导致较早的编译,而大于1.0的值将延迟编译。设置CompileThresholdScaling为0等效于禁用编译。
-XX:+DoEscapeAnalysis
启用转义分析的使用。默认情况下启用此选项。要禁用转义分析,请指定-XX:-DoEscapeAnalysis
-XX:InitialCodeCacheSize=尺寸

设置初始代码缓存大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值取决于平台。初始代码高速缓存大小不应小于系统的最小内存页面大小。下面的示例显示如何将初始代码缓存大小设置为32 KB:

-XX:InitialCodeCacheSize=32k

-XX:+Inline
启用方法内联。默认情况下启用此选项以提高性能。要禁用方法内联,请指定-XX:-Inline
-XX:InlineSmallCode=尺寸

设置可能已内联的已编译方法的最大代码大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值取决于平台以及是否启用了分层编译。在以下示例中,将其设置为1000个字节:

-XX:InlineSmallCode=1000

-XX:+LogCompilation

允许将编译活动记录到hotspot.log当前工作目录中命名的文件中。您可以使用该-XX:LogFile选项指定其他日志文件路径和名称

默认情况下,此选项为禁用状态,并且不记录编译活动。-XX:+LogCompilation选项必须与-XX:UnlockDiagnosticVMOptions解锁诊断JVM选项选项一起使用

每次使用该-XX:+PrintCompilation选项编译方法时,都可以使用打印到控制台的消息来启用详细的诊断输出

-XX:FreqInlineSize=尺寸

设置要内联的热方法的最大字节码大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值取决于平台。在以下示例中,将其设置为325个字节:

-XX:FreqInlineSize=325

-XX:MaxInlineSize=尺寸

设置要内联的Cold方法的最大字节码大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认情况下,最大字节码大小设置为35个字节:

-XX:MaxInlineSize=35

-XX:MaxTrivialSize=尺寸

设置要内联的平凡方法的最大字节码大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认情况下,平凡方法的最大字节码大小设置为6个字节:

-XX:MaxTrivialSize=6

-XX:MaxNodeLimit=节点

设置在单个方法编译期间要使用的最大节点数。默认情况下,该值取决于启用的功能。在以下示例中,最大节点数设置为100,000:

-XX:MaxNodeLimit=100000

-XX:NonNMethodCodeHeapSize=尺寸

设置包含非方法代码的代码段的大小(以字节为单位)。

包含非方法代码的非方法代码段,例如编译器缓冲区和字节码解释器。此代码类型永远保留在代码缓存中。该标志仅在-XX:SegmentedCodeCache启用时使用。

-XX:NonProfiledCodeHeapSize=尺寸
设置包含非概要分析方法的代码段的大小(以字节为单位)。该标志仅在-XX:SegmentedCodeCache启用时使用。
-XX:+OptimizeStringConcat
启用优化String串联操作。默认情况下启用此选项。要禁用优化String串联操作,请指定-XX:-OptimizeStringConcat
-XX:+PrintAssembly

通过使用外部hsdis-<arch>.so.dll库,可以打印字节码和本机方法的汇编代码对于Windows上的64位VM,为hsdis-amd64.dll这使您可以查看生成的代码,这可以帮助您诊断性能问题。

默认情况下,此选项为禁用状态,并且不打印汇编代码。-XX:+PrintAssembly选项必须与-XX:UnlockDiagnosticVMOptions解锁诊断JVM选项选项一起使用

-XX:ProfiledCodeHeapSize=尺寸
设置包含概要分析方法的代码段的大小(以字节为单位)。该标志仅在-XX:SegmentedCodeCache启用时使用。
-XX:+PrintCompilation

每次编译方法时,通过将消息打印到控制台来启用JVM的详细诊断输出。这使您可以查看实际编译了哪些方法。默认情况下,此选项是禁用的,并且不打印诊断输出。

您也可以使用该-XX:+LogCompilation选项将编译活动记录到文件中

-XX:+PrintInlining

启用内联决策的打印。让我们看看哪些方法被内联。

默认情况下,此选项为禁用状态,并且不打印内联信息。-XX:+PrintInlining选项必须与-XX:+UnlockDiagnosticVMOptions解锁诊断JVM选项选项一起使用

-XX:ReservedCodeCacheSize=尺寸
设置JIT编译的代码的最大代码缓存大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认的最大代码高速缓存大小为240 MB;默认值为100 MB。如果您使用选项禁用分层编译-XX:-TieredCompilation,则默认大小为48 MB。此选项的限制为2 GB。否则,将产生错误。最大代码缓存大小不应小于初始代码缓存大小;见选项-XX:InitialCodeCacheSize
-XX:RTMAbortRatio=abort_ratio
指定将RTM中止比率指定为所有已执行RTM事务的百分比(%)。如果中止的事务数量大于该比率,则将对编译后的代码进行优化。-XX:+UseRTMDeopt启用选项时使用此比率此选项的默认值为50。这意味着,如果中止所有事务的50%,则将对编译后的代码进行优化。
-XX:RTMRetryCount=重试次数
指定当RTM锁定代码被中止或繁忙时重试到正常锁定机制之前的重试次数。该选项的默认值为5。-XX:UseRTMLocking必须启用选项。
-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=百分
当仅给定百分比的代码缓存可用时,强制对活动方法进行堆栈扫描以主动删除未使用的代码。默认值为10%。
-XX:-TieredCompilation
禁用分层编译。默认情况下,启用此选项。
-XX:UseSSE=
启用指定版本的SSE指令集的使用。默认情况下设置为可用的受支持的最高版本(仅x86)。
-XX:UseAVX=
启用指定版本的AVX指令集的使用。默认情况下设置为可用的受支持的最高版本(仅x86)。
-XX:+UseAES
为支持它的硬件启用基于硬件的AES内部函数。具有必要说明的硬件在默认情况下会启用此选项。-XX:+UseAES是与UseAESIntrinsics结合使用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseAESIntrinsics

启用AES内部函数。指定-XX:+UseAESIntrinsics等同于也启用-XX:+UseAES要禁用基于硬件的AES内部函数,请指定-XX:-UseAES -XX:-UseAESIntrinsics例如,要启用硬件AES,请使用以下标志:

-XX:+UseAES -XX:+UseAESIntrinsics

现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions

-XX:+UseAESCTRIntrinsics
类似于-XX:+UseAESIntrinsics启用AES / CTR内部函数。
-XX:+UseGHASHIntrinsics
控制GHASH内部函数的使用。默认情况下在支持相应说明的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseBASE64Intrinsics
控制.NET加速BASE64编码例程的使用java.util.Base64默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseAdler32Intrinsics
控制Adler32固有的Adler32校验和算法的使用java.util.zip.Adler32默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseCRC32Intrinsics
控制CRC32内在函数对的使用java.util.zip.CRC32默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseCRC32CIntrinsics
控制CRC32C内部函数的使用java.util.zip.CRC32C默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseSHA

为SPARC硬件的SHA加密哈希功能启用基于硬件的内在函数。UseSHA选项与配合使用UseSHA1IntrinsicsUseSHA256IntrinsicsUseSHA512Intrinsics选项。

UseSHAUseSHA*Intrinsics标志默认情况下,在支持相应的机器指令启用。

仅当使用sun.security.provider.Sun提供程序进行SHA操作时,此功能才适用现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions

要禁用所有基于硬件的SHA内部函数,请指定-XX:-UseSHA要仅禁用特定的SHA内部函数,请使用适当的相应选项。例如:-XX:-UseSHA256Intrinsics

-XX:+UseSHA1Intrinsics
启用S​​HA-1加密哈希函数的内部函数。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseSHA256Intrinsics
启用S​​HA-224和SHA-256加密哈希函数的内部函数。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseSHA512Intrinsics
启用S​​HA-384和SHA-512加密哈希函数的内部函数。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseMathExactIntrinsics
实现各种java.lang.Math.*Exact()功能的内在化默认启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseMultiplyToLenIntrinsic
实现的中国化BigInteger.multiplyToLen()默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+ UseSquareToLenIntrinsic
实现的中国化BigInteger.squareToLen()默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+ UseMulAddIntrinsic
实现的中国化BigInteger.mulAdd()默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+使用蒙哥马利乘本征
实现的中国化BigInteger.montgomeryMultiply()默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+使用蒙哥马利广场本征
实现的中国化BigInteger.montgomerySquare()默认情况下在支持它的平台上启用。现在,控制内部函数的标志需要使用option -XX:+UnlockDiagnosticVMOptions
-XX:+UseCMoveUnconditionally
不管盈利能力分析如何,都会生成CMove(标量和矢量)指令。
-XX:+UseCodeCacheFlushing
在关闭编译器之前启用对代码缓存的刷新。默认情况下启用此选项。要在关闭编译器之前禁用刷新代码缓存,请指定-XX:-UseCodeCacheFlushing
-XX:+UseCondCardMark
启用在更新卡表之前检查卡是否已被标记的功能。默认情况下禁用此选项。它仅应在具有多个套接字的机器上使用,它可以提高依赖于并发操作的Java应用程序的性能。
-XX:+UseCountedLoopSafepoints
将安全点保持在计数循环中。其默认值取决于选定的垃圾收集器是否需要低延迟安全点。
-XX:LoopStripMiningIter=number_of_iterations
控制内部带状开采循环中的迭代次数。条带挖掘将计数的循环转换为两级嵌套循环。安全点保留在外循环中,而内循环可以全速执行。此选项控制内部循环中的最大迭代次数。默认值为1,000。
-XX:LoopStripMiningIterShortLoopnumber_of_iterations
控制循环带钢开采优化。迭代次数少于指定次数的循环将没有安全点。预设值为的1/10 -XX:LoopStripMiningIter
-XX:+UseFMA
为可用FMA指令的硬件(例如Intel,SPARC和ARM64)启用基于硬件的FMA内部函数。FMA内在函数是为java.lang.Math.fma(, , c)方法生成的,该方法计算( * + c )表达式的值
-XX:+UseRTMDeopt
根据中止率自动调整RTM锁定。该比率由-XX:RTMAbortRatio选项指定如果中止的事务数超过了中止比率,那么包含该锁的方法将被优化,并将所有锁作为普通锁重新编译。默认情况下禁用此选项。-XX:+UseRTMLocking必须启用选项。
-XX:+UseRTMLocking

使用常规锁定机制作为后备处理程序,为所有膨胀锁生成受限事务存储(RTM)锁定代码。默认情况下禁用此选项。与RTM有关的选项仅在支持事务性同步扩展(TSX)的x86 CPU上可用。

RTM是Intel TSX的一部分,该TSX是x86指令集扩展,可简化多线程应用程序的创建。RTM引入了新的指示XBEGINXABORTXEND,和XTESTXBEGINXEND说明附上一组指令作为一个事务中运行。如果在运行事务时未发现冲突,那么将在XEND指令中一起提交对存储器和寄存器的修改XABORT指令可用于显式中止事务,并且该XEND指令检查事务中是否正在运行一组指令。

当另一个线程尝试访问同一事务时,对事务的锁定会被夸大,从而阻塞了最初不请求访问该事务的线程。RTM要求指定备用操作集,以防事务中止或失败。RTM锁是已委派给TSX系统的锁。

RTM可以提高关键区域(冲突代码不能同时由多个线程访问)中冲突少的高竞争性锁的性能。RTM还提高了粗粒度锁定的性能,这种性能通常在多线程应用程序中表现不佳。(粗粒度锁定是长时间保持锁的策略,以最大程度地减少获取和释放锁的开销,而细粒度锁定是通过仅在必要时进行锁定并尽快解锁来尝试实现最大并行度的策略。 )此外,对于不同线程使用的竞争激烈的锁,RTM可以减少错误的缓存行共享,也称为缓存行乒乓。当来自不同处理器的多个线程访问不同资源时,会发生这种情况,但是资源共享相同的缓存行。结果,处理器反复使其他处理器的高速缓存行无效,这迫使它们从主内存而不是其高速缓存中读取。

-XX:+UseSuperWord
允许将标量运算转换为超字运算。超字是矢量化优化。默认情况下启用此选项。要禁止将标量运算转换为超字运算,请指定-XX:-UseSuperWord

Java的高级可维护性选项

这些java选项提供了收集系统信息和执行广泛调试的能力。

-XX:+DisableAttachMechanism

禁用使工具连接到JVM的机制。默认情况下,该选项被禁用,这意味着连接机制已启用,可以使用诊断和故障排除工具,例如jcmdjstackjmap,和jinfo

注意:使用一个JDK版本的工具对其他JDK版本进行故障排除时,不支持JDK附带的诸如jcmdjinfojmapjstack之类的工具。

-XX:+ExtendedDTraceProbes
Oracle Solaris,Linux和macOS:启用dtrace影响性能的其他工具探测。默认情况下,此选项为禁用状态,dtrace仅执行标准探测。
-XX:+HeapDumpOnOutOfMemoryError
java.lang.OutOfMemoryError引发异常时,使用堆分析器(HPROF)启用将Java堆转储到当前目录中的文件的功能您可以使用该-XX:HeapDumpPath选项显式设置堆转储文件的路径和名称默认情况下,此选项为禁用状态,并且在OutOfMemoryError引发异常时不转储堆
-XX:HeapDumpPath=path

设置-XX:+HeapDumpOnOutOfMemoryError选项时,设置用于写入由堆分析器(HPROF)提供的堆转储的路径和文件名默认情况下,该文件是在当前工作目录中创建的,其名称为java_pid<pid>.hprofwhere<pid>是导致错误的进程的标识符。以下示例显示如何显式设置默认文件(%p代表当前进程标识符):

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

  • Oracle Solaris,Linux和macOS:以下示例显示如何将堆转储文件设置为/var/log/java/java_heapdump.hprof

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

  • Windows:以下示例显示了如何将堆转储文件设置为C:/log/java/java_heapdump.log

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

-XX:LogFile=路径

将路径和文件名设置为写入日志数据的位置。默认情况下,该文件在当前工作目录中创建,并命名为hotspot.log

  • Oracle Solaris,Linux和macOS:以下示例显示如何将日志文件设置为/var/log/java/hotspot.log

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

  • Windows:以下示例显示了如何将日志文件设置为C:/log/java/hotspot.log

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

-XX:+PrintClassHistogram

启用以下事件之一后的类实例直方图打印:

  • Oracle Solaris,Linux和macOS: Control+Break

  • Windows系统: Control+CSIGTERM

默认情况下,此选项是禁用的。

设置此选项等效于运行jmap -histo命令或jcmd pid GC.class_histogram命令,其中pid是当前Java进程标识符。

-XX:+PrintConcurrentLocks

java.util.concurrent在以下事件之一之后启用打印锁:

  • Oracle Solaris,Linux和macOS: Control+Break

  • Windows系统: Control+CSIGTERM

默认情况下,此选项是禁用的。

设置此选项等效于运行jstack -l命令或jcmd pid Thread.print -l命令,其中pid是当前Java进程标识符。

-XX:+PrintFlagsRanges
打印指定的范围并允许自动测试值。请参阅验证Java虚拟机标志参数
-XX:+PerfDataSaveToFile

如果启用,则在Java应用程序退出时保存jstat二进制数据。此二进制数据保存在名为hsperfdata_pid的文件中,其中pid是您运行的Java应用程序的进程标识符。使用jstat命令来显示此文件中包含的性​​能数据,如下所示:

jstat -class file:///路径/hsperfdata_pid

jstat -gc file:///路径/hsperfdata_pid

-XX:+UsePerfData
启用perfdata功能。默认情况下启用此选项以允许JVM监视和性能测试。禁用它会抑制hsperfdata_userid目录的创建要禁用此perfdata功能,请指定-XX:-UsePerfData

Java的高级垃圾收集选项

这些java选项控制Java HotSpot VM如何执行垃圾收集(GC)。

-XX:+AggressiveHeap
启用Java堆优化。根据计算机(RAM和CPU)的配置,这会将各种参数设置为最适合长时间运行且需要大量内存分配的作业的参数。默认情况下,该选项为禁用状态,堆大小的配置不太积极。
-XX:+AlwaysPreTouch
从操作系统请求VM之后,再将内存分发给应用程序之前,请求VM触摸Java堆上的每个页面。默认情况下,此选项是禁用的,并且在应用程序使用堆空间时将提交所有页面。
-XX:ConcGCThreads=线程数

设置用于并发GC的线程数。设置threads为并行垃圾回收线程数的大约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:+UseG1GC选项启用
-XX:G1AdaptiveIHOPNumInitialSamples=
-XX:UseAdaptiveIHOP被启用此选项,设置用于收集样品直到G1自适应地确定的最佳值完成标记的周期数-XX:InitiatingHeapOccupancyPercent以前,G1-XX:InitiatingHeapOccupancyPercent为此直接使用值预设值为3。
-XX:G1HeapRegionSize=size

设置使用垃圾优先(G1)收集器时将Java堆细分为的区域的大小。该值为2的幂,范围为1 MB到32 MB。默认区域大小是根据堆大小按人体工程学确定的,目标是大约2048个区域。

下面的示例将细分的大小设置为16 MB:

-XX:G1HeapRegionSize=16m

-XX:G1HeapWastePercent=百分
设置您愿意浪费的堆百分比。当可回收百分比小于堆垃圾百分比时,Java HotSpot VM不会启动混合垃圾回收周期。默认值为5%。
-XX:G1MaxNewSizePercent=百分

设置堆大小的百分比,以用作年轻代大小的最大值。默认值为Java堆的60%。

这是一个实验性标志。此设置代替-XX:DefaultMaxNewGenPercent设置。

-XX:G1MixedGCCountTarget=
设置标记周期后混合垃圾收集的目标数量,以收集最多包含G1MixedGCLIveThresholdPercent实时数据的旧区域默认值为8个混合垃圾回收。混合馆藏的目标是在此目标数量之内。
-XX:G1MixedGCLiveThresholdPercent=百分

设置要包含在混合垃圾收集周期中的旧区域的占用阈值。默认占用率为85%。

这是一个实验性标志。此设置代替-XX:G1OldCSetRegionLiveThresholdPercent设置。

-XX:G1NewSizePercent=百分

设置要用作年轻代大小的最小值的堆百分比。默认值为Java堆的5%。

这是一个实验性标志。此设置代替-XX:DefaultMinNewGenPercent设置。

-XX:G1OldCSetRegionThresholdPercent=百分
设置在混合垃圾收集周期中要收集的旧区域数的上限。缺省值为Java堆的10%。
-XX:G1ReservePercent=百分

设置保留为错误上限的堆百分比(0到50),以减少G1收集器升级失败的可能性。当增加或减少百分比时,请确保将Java堆总值调整为相同的数量。默认情况下,此选项设置为10%。

下面的示例将保留堆设置为20%:

-XX:G1ReservePercent=20

-XX:+G1UseAdaptiveIHOP

控制老年人占用的自适应计算,以开始进行后台工作,为老年人集合做准备。如果启用,则G1会使用-XX:InitiatingHeapOccupancyPercent的值指定的前几次使用-XX:G1AdaptiveIHOPNumInitialSamples,然后自适应地自动计算初始占用的新最佳值。否则,旧代收集过程始终从确定的旧代占用率开始-XX:InitiatingHeapOccupancyPercent

默认启用。

-XX:InitialHeapSize=尺寸

设置内存分配池的初始大小(以字节为单位)。此值必须为0或1024的倍数且大于1 MB。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值是在运行时根据系统配置选择的。

以下示例说明如何使用各种单位将分配的内存大小设置为6 MB:

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

如果将此选项设置为0,则初始大小将设置为为老一代和年轻一代分配的大小之和。可以使用-XX:NewSize选项设置年轻一代的堆大小

-XX:InitialRAMPercentage=百分

设置在应用人机工程学启发式方法之前,JVM将用于Java堆的初始内存量(按-XX:MaxRAM选项中所述确定的最大内存量的百分比)默认值为1.5625%。

以下示例显示如何设置用于Java堆的初始内存量的百分比:

-XX:InitialRAMPercentage=5

-XX:InitialSurvivorRatio=

设置吞吐量垃圾收集器使用的初始幸存者空间比率(由-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=百分

设置开始占用G1垃圾收集器的前几个并发标记周期的旧占用百分比(0到100)。

默认情况下,初始值设置为45%。值0表示从开始到G1自适应设置该值之前的不间断并发GC周期。

另请参阅-XX:G1UseAdaptiveIHOP-XX:G1AdaptiveIHOPNumInitialSamples选项。

以下示例显示如何将启动堆占用率设置为75%:

-XX:InitiatingHeapOccupancyPercent=75

-XX:MaxGCPauseMillis=时间

设置最大GC暂停时间的目标(以毫秒为单位)。这是一个软目标,并且JVM将尽最大的努力来实现它。指定的值不适合您的堆大小。默认情况下,对于G1,最大暂停时间目标是200毫秒。默认情况下,其他世代收集器不使用暂停时间目标。

下面的示例显示如何将最大目标暂停时间设置为500 ms:

-XX:MaxGCPauseMillis=500

-XX:MaxHeapSize=尺寸

设置内存分配池的最大大小(以字节为单位)。此值必须是1024的倍数且大于2 MB。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值是在运行时根据系统配置选择的。对于服务器部署,选项-XX:InitialHeapSize-XX:MaxHeapSize通常设置为相同的值。

下面的示例演示如何使用各种单位将分配的最大内存大小设置为80 MB:

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

-XX:MaxHeapSize选项等效于-Xmx

-XX:MaxHeapFreeRatio=百分

设置GC事件后允许的最大可用堆空间百分比(0到100)。如果可用堆空间扩展到该值以上,则堆将收缩。默认情况下,此值设置为70%。

通过使用命令行选项降低参数的值MaxHeapFreeRatio(默认值是70%)和MinHeapFreeRatio(默认值是40%)来最小化Java堆大小降低到10%和5%可以成功减小堆大小,而不会降低性能。但是,结果可能会因您的应用程序而异。尝试为这些参数使用不同的值,直到它们尽可能低但仍保持可接受的性能。-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatioMaxHeapFreeRatioMinHeapFreeRatio

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

试图使堆较小的客户也应该添加该选项-XX:-ShrinkHeapInSteps有关使用此选项通过减少嵌入式应用程序的动态占用空间来减小Java堆大小的说明,请参见性能调整示例

-XX:MaxMetaspaceSize=尺寸

设置可以分配给类元数据的最大本机内存。默认情况下,大小不受限制。应用程序的元数据量取决于应用程序本身,其他正在运行的应用程序以及系统上可用的内存量。

下面的示例显示如何将最大类元数据大小设置为256 MB:

-XX:MaxMetaspaceSize=256m

-XX:MaxNewSize=尺寸
设置年轻代(托儿所)的堆的最大大小(以字节为单位)。默认值是根据人体工程学设置的。
-XX:MaxRAM=尺寸

设置在应用人体工程学启发式方法之前,JVM可用于Java堆的最大内存量。默认值为JVM进程的最大可用内存量或128 GB,以较低者为准。

JVM进程的最大可用内存量是机器物理内存和环境(例如容器)设置的任何约束条件中的最小值。

如果此选项和其他影响最大内存量的选项的组合结果大于压缩oop可寻址的内存范围,则指定此选项将禁用自动使用压缩oop。请参阅-XX:UseCompressedOops有关压缩的oop的更多信息。

以下示例显示如何将用于将Java堆大小调整为2 GB的最大可用内存量:

-XX:MaxRAM=2G

-XX:MaxRAMPercentage=百分

设置在应用人机工程学启发式方法之前,JVM可用于Java堆的最大内存量(按-XX:MaxRAM选项中所述确定的最大内存量的百分比)默认值为25%。

如果此选项和其他影响最大内存量的选项的组合结果大于压缩oop可寻址的内存范围,则指定此选项将禁用自动使用压缩oop。请参阅-XX:UseCompressedOops有关压缩的oop的更多信息。

以下示例显示如何设置用于Java堆的最大内存量的百分比:

-XX:MaxRAMPercentage=75

-XX:MinRAMPercentage=百分

设置在应用人机工程学启发式方法之前,JVM可用于Java堆的最大内存量(按-XX:MaxRAM小堆选项中所述确定的最大内存量的百分比)小堆是大约125 MB的堆。默认值为50%。

以下示例显示了如何为小堆设置用于Java堆的最大内存量的百分比:

-XX:MinRAMPercentage=75

-XX:MaxTenuringThreshold=

设置用于自适应GC大小调整的最大使用期限阈值。最大值为15。并行(吞吐量)收集器的默认值为15。

以下示例显示如何将最大期限阈值设置为10:

-XX:MaxTenuringThreshold=10

-XX:MetaspaceSize=尺寸
设置分配的类元数据空间的大小,该类元数据空间在首次超过垃圾收集时会触发垃圾收集。垃圾收集的阈值取决于使用的元数据量而增加或减少。默认大小取决于平台。
-XX:MinHeapFreeRatio=百分

设置GC事件后允许的最小最小可用堆空间百分比(0到100)。如果可用堆空间低于此值,则堆将被扩展。默认情况下,此值设置为40%。

通过使用命令行选项降低参数的值MaxHeapFreeRatio(默认值为70%)和MinHeapFreeRatio(默认值为40%)来最小化Java堆大小降低到10%和5%可以成功减小堆大小,而不会降低性能。但是,结果可能会因您的应用程序而异。为这些参数尝试不同的值,直到它们尽可能的低,但仍保持可接受的性能。-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatioMaxHeapFreeRatioMinHeapFreeRatio

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

试图使堆较小的客户也应该添加该选项-XX:-ShrinkHeapInSteps有关使用此选项通过减少嵌入式应用程序的动态占用空间来减小Java堆大小的说明,请参见性能调整示例

-XX:MinHeapSize=尺寸

设置内存分配池的最小大小(以字节为单位)。此值必须为0或1024的倍数且大于1 MB。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。默认值是在运行时根据系统配置选择的。

下面的示例演示如何使用各种单位将分配的内存的最小大小设置为6 MB:

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

如果将此选项设置为0,则最小大小将设置为与初始大小相同的值。

-XX:NewRatio=

设置年轻和年老大小之间的比率。默认情况下,此选项设置为2。下面的示例演示如何将年轻人与成年人的比例设置为1:

-XX:NewRatio=1

-XX:NewSize=尺寸

设置年轻一代(苗圃)的堆的初始大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。

堆的年轻代区域用于新对象。与其他区域相比,在该区域执行GC的频率更高。如果年轻一代的大小太小,则会执行大量次要GC。如果大小太大,则仅执行完整的GC,这可能需要很长时间才能完成。建议您使年轻代的大小保持大于堆总大小的25%,并且小于总堆大小的50%。

以下示例显示如何使用各种单位将年轻代的初始大小设置为256 MB:

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

-XX:NewSize选项等效于-Xmn

-XX:ParallelGCThreads=线程数

设置世界停止(STW)工作线程数。默认值取决于JVM和所选垃圾回收器可用的CPU数量。

例如,要将G1 GC的线程数设置为2,请指定以下选项:

-XX:ParallelGCThreads=2

-XX:+ParallelRefProcEnabled
启用并行参考处理。默认情况下,此选项是禁用的。
-XX:+PrintAdaptiveSizePolicy
允许打印有关自适应世代尺寸的信息。默认情况下,此选项是禁用的。
-XX:+ScavengeBeforeFullGC
在每个完整GC之前启用年轻一代的GC。默认情况下启用此选项。建议您不要禁用它,因为在完整GC之前清除年轻一代可以减少从旧一代空间到年轻一代空间可访问的对象数量。要在每个完整GC之前禁用年轻一代的GC,请指定选项-XX:-ScavengeBeforeFullGC
-XX:SoftRefLRUPolicyMSPerMB=时间

设置在最后一次引用之后,软可访问对象在堆上保持活动状态的时间(以毫秒为单位)。缺省值是堆中每个空闲兆字节的生命周期的一秒钟。-XX:SoftRefLRUPolicyMSPerMB选项接受整数值,整数值表示当前堆大小(对于Java HotSpot Client VM)每1 MB的毫秒数或最大可能堆大小(对于Java HotSpot Server VM)。这种差异意味着客户端VM倾向于刷新软引用而不是增大堆,而服务器VM倾向于增大堆而不是刷新软引用。在后一种情况下,该-Xmx选项的值对软引用被垃圾收集的速度有重大影响。

下面的示例显示如何将该值设置为2.5秒:

-XX:SoftRefLRUPolicyMSPerMB=2500

-XX:-ShrinkHeapInSteps

逐步将Java堆减小到由option指定的目标大小-XX:MaxHeapFreeRatio默认情况下启用此选项。如果禁用,那么它将立即将Java堆减小到目标大小,而不需要多个垃圾回收周期。如果要最小化Java堆大小,请禁用此选项。禁用此选项时,您可能会遇到性能下降的情况。

有关使用选项通过减少嵌入式应用程序的动态占用空间来减小Java堆大小的说明,请参见性能调整示例MaxHeapFreeRatio

-XX:StringDeduplicationAgeThreshold=

标识String达到指定年龄的对象被视为重复数据删除的候选对象。对象的年龄是衡量垃圾回收存活了多少次的指标。有时将其称为保有权。

注意: String在达到此年龄之前提升为旧堆区域的对象始终被视为重复数据删除的候选对象。此选项的默认值为3参见-XX:+UseStringDeduplication选项。

-XX:SurvivorRatio=

设置伊甸园空间大小与幸存者空间大小之间的比率。默认情况下,此选项设置为8。以下示例显示如何将eden / survivor空间比率设置为4:

-XX:SurvivorRatio=4

-XX:TargetSurvivorRatio=百分

设置收集年轻垃圾后所需的生存空间百分比(0到100)。默认情况下,此选项设置为50%。

以下示例显示如何将目标幸存者空间比率设置为30%:

-XX:TargetSurvivorRatio=30

-XX:TLABSize=尺寸

设置线程本地分配缓冲区(TLAB)的初始大小(以字节为单位)。追加字母kK表示千字节,mM表示兆字节,或gG表示千兆字节。如果此选项设置为0,那么JVM将自动选择初始大小。

以下示例显示如何将初始TLAB大小设置为512 KB:

-XX:TLABSize=512k

-XX:+UseAdaptiveSizePolicy
启用自适应生成大小调整。默认情况下启用此选项。要禁用自适应生成大小调整,请-XX:-UseAdaptiveSizePolicy显式指定并设置内存分配池的大小。参见-XX:SurvivorRatio选项。
-XX:+UseG1GC
启用垃圾优先(G1)垃圾收集器的使用。它是服务器式的垃圾收集器,适用于具有大量RAM的多处理器计算机。此选项极有可能满足GC暂停时间目标,同时保持良好的吞吐量。建议将G1收集器用于需要大堆(大小约为6 GB或更大)且GC延迟要求有限(小于0.5秒的稳定且可预测的暂停时间)的应用程序。默认情况下,启用此选项,并且G1用作默认垃圾收集器。
-XX:+UseGCOverheadLimit
启用对在OutOfMemoryError抛出异常之前限制JVM在GC上花费的时间比例的策略的使用默认情况下,启用此选项,OutOfMemoryError如果GC的总时间中有98%以上花费在垃圾收集上,而回收的少于2%,则并行GC会抛出当堆很小时,可以使用此功能来防止应用程序长时间运行而进展很少或没有进展。要禁用此选项,请指定选项-XX:-UseGCOverheadLimit
-XX:+UseNUMA
通过增加应用程序对低延迟内存的使用,在具有非均匀内存体系结构(NUMA)的计算机上启用应用程序的性能优化。默认情况下,此选项为禁用状态,并且不对NUMA进行优化。该选项仅在使用并行垃圾收集器(-XX:+UseParallelGC时可用
-XX:+UseParallelGC

允许使用并行清除垃圾收集器(也称为吞吐量收集器)来利用多个处理器来提高应用程序的性能。

默认情况下,此选项是禁用的,并且使用默认的收集器。如果启用,则-XX:+UseParallelOldGC除非您明确禁用它,否则选项将自动启用。

-XX:+UseSerialGC
启用串行垃圾收集器的使用。对于不需要垃圾回收具有任何特殊功能的小型和简单应用程序,这通常是最佳选择。默认情况下,此选项是禁用的,并且使用默认的收集器。
-XX:+UseSHM

仅限Linux:使JVM使用共享内存来设置大页面。

有关设置大页面的信息请参见页面。

-XX:+UseStringDeduplication

启用字符串重复数据删除。默认情况下,此选项是禁用的。要使用此选项,必须启用垃圾优先(G1)垃圾收集器。

字符串重复数据消除String通过利用许多String对象相同的事实来减少Java堆上对象的内存占用String相同的String对象可以指向并共享相同的字符数组,而不是每个对象都指向其自己的字符数组。

-XX:+UseTLAB
允许在年轻代空间中使用线程本地分配块(TLAB)。默认情况下启用此选项。要禁用TLAB,请指定选项-XX:-UseTLAB
-XX:+UseZGC

启用Z垃圾收集器的使用。此垃圾收集器最适合以一定的吞吐量成本为大型Java堆提供最低的延迟。这是一个实验性的垃圾收集器,您需要在命令行-XX:+UnlockExperimentalVMOptions之前指定-XX:+UseZGC

例:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

不推荐使用的Java选项

这些java选项已被弃用,并可能在将来的JDK版本中删除。它们仍然被接受并采取了行动,但是在使用它们时会发出警告。

-Xfuture
启用严格的类文件格式检查,以严格符合类文件格式规范。开发人员在开发新代码时应使用此标志。在将来的版本中,更严格的检查可能会成为默认设置。
-Xloggc:文件名

设置应将详细的GC事件信息重定向到该文件以进行日志记录的文件。如果两者都使用相同的java命令给出,则-Xloggc选项会覆盖-verbose:gc-Xloggc:filename替换为-Xlog:gc:filename请参阅使用JVM Unified Logging Framework启用日志记录。

例:

-Xlog:gc:garbage-collection.log

-XX:+FlightRecorder
在应用程序运行时启用Java Flight Recorder(JFR)的使用。从JDK 8u40开始,使用JFR不需要此选项。
-XX:InitialRAMFraction=

设置在应用人机工程学启发式方法之前,JVM可用于Java堆的初始内存量,作为该-XX:MaxRAM选项中确定的最大内存量的比率默认值为64。

使用该选项-XX:InitialRAMPercentage

-XX:MaxRAMFraction=

设置在应用人体工程学启发式方法之前,JVM可用于Java堆的最大内存量是该-XX:MaxRAM选项中确定的最大内存量的一部分预设值为4。

如果此选项和其他影响最大内存量的选项的组合结果大于压缩oop可寻址的内存范围,则指定此选项将禁用自动使用压缩oop。请参阅-XX:UseCompressedOops有关压缩的oop的更多信息。

使用该选项-XX:MaxRAMPercentage

-XX:MinRAMFraction=

设置在应用人机工程学启发式方法之前,JVM可用于Java堆的最大内存量-XX:MaxRAM是小堆选项中所述的最大内存量的一部分小堆是大约125 MB的堆。预设值为2。

使用该选项-XX:MinRAMPercentage

-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统一日志记录框架启用日志记录

-XX:+UseParallelOldGC
允许将并行垃圾收集器用于完整的GC。默认情况下,此选项是禁用的。启用它会自动启用该-XX:+UseParallelGC选项。

过时的Java选项

这些java选项仍被接受但被忽略,并且在使用它们时会发出警告。

-XX:+FailOverToOldVerifier
当新类型检查器失败时,启用自动故障转移到旧验证程序。默认情况下,此选项是禁用的,并且对于具有最新字节码版本的类,它将被忽略(即被视为禁用)。您只能为具有旧版本字节码的类启用它。
-XX:+UseMembar
在线程状态转换时启用发行成员。默认情况下,此选项在所有启用了ARM服务器的平台上均被禁用。
-XX:MaxPermSize=尺寸
设置最大永久生成空间大小(以字节为单位)。该选项在JDK 8中已弃用,并由该-XX:MaxMetaspaceSize选项取代
-XX:PermSize=尺寸
设置分配给永久生成的空间(以字节为单位),如果超出该空间则触发垃圾回收。该选项在JDK 8中已弃用,并由该-XX:MetaspaceSize选项取代
-XX:+UseConcMarkSweepGC
启用CMS垃圾收集器用于旧版本。CMS是默认垃圾收集器(G1)的替代方案,默认垃圾收集器(G1)还致力于满足应用程序延迟要求。默认情况下,此选项是禁用的,并且将根据计算机的配置和JVM的类型自动选择收集器。

删除了Java选项

javaJDK 14中没有删除任何文档选项。

有关在先前版本中删除的选项的列表和说明,请参阅以下内容中的“删除的Java选项”部分:

java命令行参数文件

您可以java通过使用@参数文件指定一个或多个包含传递给java命令的参数(例如选项和类名)的文本文件来缩短或简化命令。这使您可以java在任何操作系统上创建任意长度的命令。

在命令行中,使用at符号(@)前缀标识包含java选项和类名的参数文件java命令遇到以at符号(@开头的文件时,它将将该文件的内容扩展为参数列表,就像在命令行中指定的一样。

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)。

  • @不支持使用at符号()递归解释文件。

参数文件中的开放引号或部分引号的示例

在参数文件中,

-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/optionspath2/options表示具有不同路径的参数文件。它们包含的任何相对路径都相对于当前工作目录而不是参数文件:

java @path1/options @path2/classes

代码堆状态分析

总览

在某些情况下,深入了解JVM代码堆的当前状态将有助于回答以下问题:

  • 为什么关闭JIT然后又一次又一次打开?

  • 所有代码堆空间都去了哪里?

  • 为什么方法清除程序无法有效工作?

为了提供这种见解,已实现了代码堆状态分析功能,该功能可对代码堆进行动态分析。分析过程分为两个部分。第一部分检查整个代码堆,并汇总所有被认为有用或重要的信息。第二部分包括几个独立的步骤,这些步骤将打印收集的信息,并着重于数据的不同方面。数据收集和打印是根据“请求”进行的。

句法

可以使用以下命令发出实时的实时分析请求:

jcmd pid Compiler.CodeHeap_Analytics [功能] [粒度]

如果您仅对运行示例工作负载之后的代码堆外观感兴趣,可以使用命令行选项:

-Xlog:codecache=Trace

要在“代码缓存已满”情况存在时查看代码堆状态,请使用命令行选项启动VM:

-Xlog:codecache=Debug

有关代码堆状态分析功能,支持的功能和粒度选项的详细说明,请参见CodeHeap状态分析(OpenJDK)

使用JVM统一日志记录框架启用日志记录

您可以使用该-Xlog选项来配置或启用Java虚拟机(JVM)统一日志记录框架的日志记录。

概要

-Xlog:[什么] [ :[输出] [ :[装饰器] [:输出选项,...]]]]]

什么
指定标签和级别为tag1 [ +tag2 ...] [ *] [ =level ] [ ,...]的组合。除非*指定了通配符(),否则只有匹配了指定标签的日志消息才被匹配。请参见-Xlog标签和级别
输出
设置输出类型。省略输出类型默认为stdout请参见-Xlog输出
装饰工
将输出配置为使用一组自定义的装饰器。省略装饰默认为uptimeleveltags请参阅装饰
输出选项
设置-Xlog日志记录输出选项。

描述

Java虚拟机(JVM)统一日志记录框架为JVM的所有组件提供了通用的日志记录系统。JVM的GC日志记录已更改为使用新的日志记录框架。将旧的GC标志映射到相应的新Xlog配置在将GC日志记录标志转换为Xlog中进行了描述此外,运行时日志记录也已更改为使用JVM统一日志记录框架。将运行时日志记录标志转换为Xlog中描述了旧版运行时日志记录标志到相应的新Xlog配置的映射

以下内容提供了有关-Xlog命令和选项语法的快速参考

-Xlog
info级别上启用JVM登录
-Xlog:help
打印-Xlog用法语法和可用的标签,级别和修饰符,以及带有说明的示例命令行。
-Xlog:disable
关闭所有日志记录并清除日志记录框架的所有配置,包括警告和错误的默认配置。
-Xlog[:选项]

按照它们在命令行中出现的顺序应用多个参数。-Xlog同一输出的多个参数按其给定顺序相互覆盖。

选项设置为:

[标签选择] [ :[输出] [ :[装饰器] [:输出选项]]]

省略标签选择默认为标签集all和级别info

标记+...]all

all标签是由所有可用的标签集的元标记。*标签集定义中的星号表示通配符标签匹配。与通配符匹配将选择至少包含指定标签的所有标签集如果没有通配符,则仅选择指定标记集的完全匹配项。

输出选项

filecount=文件计数 filesize=文件大小,带有可选的K,M或G后缀

默认配置

如果在-Xlog命令行中未指定选项,则使用默认配置。缺省配置记录所有消息的级别与警告或错误相匹配,而与消息关联的标记无关。默认配置等同于在命令行上输入以下内容:

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

在运行时控制日志

还可以在运行时通过诊断命令(使用jcmd实用程序)控制日志记录命令行上可以指定的所有内容也可以使用命令动态指定VM.log由于诊断命令会自动显示为MBean,因此您可以使用JMX在运行时更改日志记录配置。

-Xlog标签和级别

每个日志消息都有一个级别和与之关联的标记集。该消息对应于它的细节水平,并且所述标签集对应于什么消息包含或JVM部件它涉及(例如,gcjit,或os)。将GC日志记录标志转换为Xlog中描述了将GC标志映射到Xlog配置将旧版运行时日志记录标志映射到相应的Xlog配置在将运行时日志记录标志转换为Xlog中进行了描述

可用的日志级别:

  • off
  • trace
  • debug
  • info
  • warning
  • error

可用的日志标签:

从字面上看,有几十个日志标签,以正确的组合可以启用一系列日志输出。可以使用查看完整的可用日志标签集-Xlog:help指定all而不是标签组合会匹配所有标签组合。

-Xlog输出

-Xlog选件支持以下类型的输出:

  • stdout -将输出发送到标准输出
  • stderr -将输出发送到stderr
  • file=文件名---将输出发送到文本文件。

当使用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默认为uptimeleveltagsnone装饰是特殊的,是用来关闭所有的装饰品。

time也可以将(t),utctimeutc),uptimeu),timemillistm),uptimemillisum),timenanostn),uptimenanosun),hostnamehn),pidp),tidti),levell),tagstg)装饰器指定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 与日志消息关联的标签集。

将GC记录标志转换为Xlog

传统垃圾收集(GC)标志Xlog配置评论
G1PrintHeapRegions -Xlog:gc+region=trace 不适用
GCLogFileSize 无可用配置 日志轮换由框架处理。
NumberOfGCLogFiles 不适用 日志轮换由框架处理。
PrintAdaptiveSizePolicy -Xlog:gc+ergo*=水平 使用水平debug大部分信息,或者级别trace所有的已记录的内容PrintAdaptiveSizePolicy
PrintGC -Xlog:gc 不适用
PrintGCApplicationConcurrentTime -Xlog:safepoint 请注意,PrintGCApplicationConcurrentTimePrintGCApplicationStoppedTime记录在相同的标签上,并且在新的记录中没有分开。
PrintGCApplicationStoppedTime -Xlog:safepoint 请注意,PrintGCApplicationConcurrentTimePrintGCApplicationStoppedTime被记录在相同的标签上,并且在新的记录中没有分开。
PrintGCCause 不适用 现在始终记录GC原因。
PrintGCDateStamps 不适用 日期戳由框架记录。
PrintGCDetails -Xlog:gc* 不适用
PrintGCID 不适用 现在始终记录GC ID。
PrintGCTaskTimeStamps -Xlog:gc+task*=debug 不适用
PrintGCTimeStamps 不适用 时间戳由框架记录。
PrintHeapAtGC -Xlog:gc+heap=trace 不适用
PrintReferenceGC -Xlog:gc+ref*=debug 请注意,在旧的日志记录中,PrintReferenceGCPrintGCDetails在同时启用的情况下起作用
PrintStringDeduplicationStatistics `-Xlog:gc + stringdedup * =调试 `不适用
PrintTenuringDistribution -Xlog:gc+age*=水平 使用水平debug最相关的信息,或者级别trace所有的已记录的内容PrintTenuringDistribution
UseGCLogFileRotation 不适用 记录了什么PrintTenuringDistribution

将运行时日志记录标志转换为Xlog

旧版运行时标志Xlog配置评论
TraceExceptions -Xlog:exceptions=info 不适用
TraceClassLoading -Xlog:class+load=水平 level =info用于常规信息,或将level =debug用于其他信息。在统一日志记录语法中,-verbose:class等于-Xlog:class+load=info,class+unload=info
TraceClassLoadingPreorder -Xlog:class+preorder=debug 不适用
TraceClassUnloading -Xlog:class+unload=水平 level =info用于常规信息,或将level =trace用于其他信息。在统一日志记录语法中,-verbose:class等于-Xlog:class+load=info,class+unload=info
VerboseVerification -Xlog:verification=info 不适用
TraceClassPaths -Xlog:class+path=info 不适用
TraceClassResolution -Xlog:class+resolve=debug 不适用
TraceClassInitialization -Xlog:class+init=info 不适用
TraceLoaderConstraints -Xlog:class+loader+constraints=info 不适用
TraceClassLoaderData -Xlog:class+loader+data=水平 level =debug用于常规信息或将level =trace用于其他信息。
TraceSafepointCleanupTime -Xlog:safepoint+cleanup=info 不适用
TraceSafepoint -Xlog:safepoint=debug 不适用
TraceMonitorInflation -Xlog:monitorinflation=debug 不适用
TraceBiasedLocking -Xlog:biasedlocking=水平 level =info用于常规信息,或将level =trace用于其他信息。
TraceRedefineClasses -Xlog:redefine+class*=水平 级别info,,debugtrace提供越来越多的信息。

-Xlog用法示例

以下是-Xlog示例。

-Xlog

通过记录所有消息info层面stdoutuptimelevelstags装饰品。这等效于使用:

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

-Xlog:gc
gc使用标签标记的消息记录info到级别stdout该级别上所有其他消息的默认配置warning生效。
-Xlog:gc,safepoint
使用默认装饰将使用gcsafepoint标签标记的消息(使用info级别)记录到stdout消息标记都gcsafepoint将不被记录。
-Xlog:gc+ref=debug
记录标记有gcref标签的消息,使用debug级别为stdout,具有默认修饰。仅使用两个标签之一标记的邮件将不会被记录。
-Xlog:gc=debug:file=gc.txt:none
gc使用debug级别将标记有标签的消息记录到一个gc.txt没有修饰的文件中该级别的所有其他消息的默认配置warning仍然有效。
-Xlog:gc=trace:file=gctrace.txt:uptimemillis,pids:filecount=5,filesize=1024

gc使用该trace级别标记有标签的消息记录到一个旋转文件集中,该文件集中有5个文件,基本名称为1 MB,gctrace.txt并使用修饰符uptimemillispid

该级别的所有其他消息的默认配置warning仍然有效。

-Xlog:gc::uptime,tid
gc使用默认的'info'级别记录标记了标签的消息,以默认输出,stdout并使用修饰符uptimetid该级别的所有其他消息的默认配置warning仍然有效。
-Xlog:gc*=info,safepoint*=off
至少gc使用该info级别记录标记有消息的消息,但是关闭标记有的消息的记录safepoint消息标记都gcsafepoint将不被记录。
-Xlog:disable -Xlog:safepoint=trace:safepointtrace.txt
关闭所有日志记录,包括警告和错误,然后将safepoint使用trace级别标记的消息启用到文件safepointtrace.txt默认配置不适用,因为命令行以开头-Xlog:disable

复杂的-Xlog使用示例

下面介绍了使用该-Xlog选项的一些复杂示例

-Xlog:gc+class*=debug
记录至少标记为gcclass标记debug为的消息stdout该级别的所有其他消息的默认配置warning仍然有效
-Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt
使用级别将至少标记有gcmeta标签的消息记录trace到文件中,metatrace.txt但关闭所有标记有的消息class标有gcmeta和的邮件class不会记录为class*关闭状态。warning除包括的消息,所有其他级别的消息的默认配置均有效class
-Xlog:gc+meta=trace
使用到级别记录完全标记为gcmeta标记的消息该级别的所有其他消息的默认配置仍然有效。 tracestdoutwarning
-Xlog:gc+class+heap*=debug,meta*=warning,threads*=off
将信息记录标记至少gcclassheap使用标签的trace水平,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}

这有助于识别需要实现的标志。自动测试框架可以跳过那些没有值且未实现的标志。

大页

您将大页面(也称为大页面)用作显着大于标准内存页面大小(取决于处理器和操作系统)的内存页面。大页面优化了处理器平移后备缓冲区。

Translation-Lookaside缓冲区(TLB)是一个页面转换缓存,其中保存了最近使用的虚拟到物理地址转换。TLB是一种稀缺的系统资源。由于处理器随后必须从分层页表中读取,因此可能需要多个内存访问,因此TLB丢失的代价可能很高。通过使用更大的内存页面大小,单个TLB条目可以代表更大的内存范围。这将减少对TLB的压力,并且内存密集型应用程序可能具有更好的性能。

但是,大页面页面内存可能会对系统性能产生负面影响。例如,当应用程序固定大量内存时,可能会导致常规内存不足,并导致其他应用程序中的过多分页,并使整个系统变慢。同样,长时间运行的系统可能会产生过多的碎片,这可能导致无法保留足够大的页面内存。发生这种情况时,OS或JVM都会恢复为使用常规页面。

Oracle Solaris,Linux和Windows支持大页面。

对Oracle Solaris的大页面支持

Oracle Solaris包括多页面大小支持(MPSS)。无需其他配置。

对Linux的大页面支持

2.6内核支持大页面。一些供应商已将代码反向移植到其基于2.4的发行版中。要检查您的系统是否可以支持大页内存,请尝试以下操作:

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

如果输出显示三个“ Huge”变量,则您的系统可以支持大页内存,但是需要对其进行配置。如果命令什么都不打印,则说明您的系统不支持大页面。要将系统配置为使用大页面内存,请以身份登录root,然后执行以下步骤:

  1. 如果您使用的是选项-XX:+UseSHM(而不是-XX:+UseHugeTLBFS),请增加该SHMMAX值。它必须大于Java堆大小。在具有4 GB物理RAM(或更少)的系统上,以下内容可共享所有内存:

    # echo 4294967295 > /proc/sys/kernel/shmmax

  2. 如果使用选项-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.localsysctl.conf)。

  • 如果配置(或调整大小)OS内核参数/proc/sys/kernel/shmmax/proc/sys/vm/nr_hugepages,则Java进程可能会为Java堆以外的区域分配较大的页面。这些步骤可以为以下区域分配大页面:

    • Java堆
    • 代码缓存
    • 并行GC的标记位图数据结构

    因此,如果将nr_hugepages参数配置为Java堆的大小,那么JVM可能无法在大页面上分配代码缓存区域,因为这些区域的大小很大。

Windows的大页面支持

要在Windows上使用大页面支持,管理员必须首先为运行该应用程序的用户分配其他特权:

  1. 选择“控制面板”,“管理工具”,然后选择“本地安全策略”
  2. 选择本地策略,然后选择用户权限分配
  3. 双击“锁定内存中的页面”,然后添加用户和/或组。
  4. 重新启动系统。

请注意,即使是管理员在运行应用程序,也需要执行这些步骤,因为默认情况下,管理员没有权限将页面锁定在内存中。

应用程序类数据共享

应用程序类数据共享(AppCDS)扩展了类数据共享(CDS),使应用程序类可以放置在共享档案中。

除了核心库类之外,AppCDS还从以下位置支持类数据共享

  • 运行时映像中的平台类
  • 运行时映像中的应用程序类
  • 类路径中的应用程序类
  • 模块路径中的应用程序类

归档应用程序类可在运行时提供更好的启动时间。当运行多个JVM进程时,AppCDS还通过共享只读元数据的内存来减少运行时的占用空间。

CDS / AppCDS仅支持从JAR文件归档类。

在JDK 11之前,在以下情况下,非空目录被报告为致命错误:

  • 对于基本CDS,-Xbootclasspath/a路径中不能存在非空目录

  • 使用-XX:+UseAppCDS-Xbootclasspath/a路径,类路径和模块路径中将不存在非空目录

在JDK 11和更高版本中,-XX:+UseAppCDS它已过时,并且非空目录的行为基于类列表中的类类型。在以下情况下,非空目录被报告为致命错误:

  • 如果未加载应用程序类或平台类,则转储时间仅在-Xbootclasspath/a路径中存在非空目录时报告错误

  • 如果加载了应用程序类或平台类,则转储时间将报告-Xbootclasspath/a路径,类路径或模块路径中存在的非空目录的错误

在JDK 11及更高版本中,使用-XX:DumpLoadedClassList=class_list_file会生成包含所有类(系统库类和应用程序类)的生成的类列表。您不再需要指定-XX:+UseAppCDSwith-XX:DumpLoadedClassList即可生成完整的类列表。

在JDK 11和更高版本中,由于UseAppCDS已过时,因此SharedArchiveFile默认情况下成为产品标志。指定+UnlockDiagnosticVMOptionsSharedArchiveFile不再需要任何配置。

类数据共享(CDS)/ AppCDS不支持在类列表中归档数组类。当遇到类列表中的数组时,CDS转储时间会给出明确的错误消息:

Preload Warning: Cannot find array_name

尽管不允许在类列表中使用数组,但仍可以在CDS / AppCDS转储时创建某些数组类。这些数组是在Java类加载器(PlatformClassLoader和系统类加载器)执行Java代码以在转储时加载类的过程中创建的。创建的数组与其余已加载的类一起归档。

扩展类数据共享以支持模块路径

在JDK 11中,对类数据共享(CDS)进行了改进,以支持从模块路径归档类。

  • 要使用--module-pathVM选项创建CDS存档,请使用以下命令行语法:

    java -Xshare:dump -XX:SharedClassListFile=class_list_file -XX:SharedArchiveFile=shared_archive_file --module-path=path_to_modular_jar -m MODULE_NAME

  • 要使用--module-pathVM选项与CDS存档一起运行,请使用以下命令行语法:

    java -XX:SharedArchiveFile=shared_archive_file --module-path=path_to_modular_jar -m MODULE_NAME

下表描述了如何将与模块路径相关的VM选项与-Xshare选项一起使用

选项-Xshare:转储-Xshare:{on,auto}
--module-pathmp 允许的 允许2
--module 允许的 允许的
--add-module 允许的 允许的
--upgrade-module-path3 不允许(如果指定,则退出) 允许(禁用CDS)
--patch-module4 不允许(如果指定,则退出) 允许(禁用CDS)
--limit-modules5 不允许(如果指定,则退出) 允许(禁用CDS)

1尽管有两种方法可以在中指定模块--module-path,即模块化JAR或分解模块,但仅支持模块化JAR。

2在转储时间与运行时间之间可以指定不同的mp如果mp1.jar在转储时从归档类K加载,但是mp的更改导致它mp2.jar在运行时可从其他库中获得,则K的归档版本将在运行时被忽略;K将动态加载。

3当前,只有两个系统模块是可升级的(java.compilerjdk.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应用程序使用的所有类最后一步使用共享存档文件运行应用程序。

  1. 创建test.Hello应用程序使用的所有类的列表以下命令创建一个名为的文件hello.classlist,其中包含此应用程序使用的所有类的列表:

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

    请注意,由-cp参数指定的类路径必须仅包含JAR文件。

  2. 创建一个名为的共享档案,hello.jsa其中包含以下所有类hello.classlist

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

    请注意,在归档创建时使用的类路径必须与运行时使用的类路径相同(或为其前缀)。

  3. test.Hello使用共享档案运行应用程序hello.jsa

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

  4. 可选验证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存档运行应用程序。

  1. 创建一个名为的动态CDS存档,hello.jsa其中包含hello.jar应用程序加载的所有类test.Hello

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

    请注意,在归档创建时使用的类路径必须与运行时使用的类路径相同(或为其前缀)。

  2. test.Hello使用共享档案运行应用程序hello.jsa

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

  3. 可选重复上一节的步骤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.jarhello.jarhi.jar存档的common.jsa,因为他们都在类路径中的存档步骤(步骤3)。

包括来自班hello.jarhi.jar,该.jar文件必须被添加到由指定的类路径-cp参数。

  1. 创建该Hello应用程序使用的所有类的列表以及该应用程序的另一个列表Hi

    java -XX:DumpLoadedClassList=hello.classlist -cp common.jar:hello.jar Hello

    java -XX:DumpLoadedClassList=hi.classlist -cp common.jar:hi.jar Hi

  2. 创建将共享共享存档文件的所有应用程序使用的类的单个列表。

    甲骨文的Solaris,Linux的,和MacOS以下命令组合中的文件hello.classlisthi.classlist成一个文件,common.classlist

    cat hello.classlist hi.classlist > common.classlist

    窗户下面的命令合并文件hello.classlisthi.classlist成一个文件,common.classlist

    type hello.classlist hi.classlist > common.classlist

  3. 创建一个common.jsa包含以下所有类的共享归档文件common.classlist

    java -Xshare:dump -XX:SharedArchiveFile=common.jsa -XX:SharedClassListFile=common.classlist -cp common.jar:hello.jar:hi.jar

    使用的classpath参数是HelloHi应用程序共享的通用类路径前缀

  4. 使用相同的共享档案运行HelloHi应用程序:

    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

当您在同一主机上运行多个JVM进程时,JDK 9和更高版本支持将符号和字符串对象都添加到存档中以进行内存共享。一个示例是让多个JVM进程使用同一组Java EE类。加载和使用这些通用类时,可以创建新的符号和字符串,并将其添加到JVM的内部“符号”和“字符串”表中。在运行时,可以在多个JVM进程之间共享从存档文件映射的符号或字符串对象,从而减少了总体内存使用量。此外,归档字符串还可以在启动时间和运行时执行方面提供更多的性能优势。

在JDK 10和更高版本中,已归档类中的CONSTANT_String条目在转储时解析为Interned String对象,并且所有Interned String对象也已归档。但是,即使所有归档类中的所有CONSTANT_String文字都已解决,但在类文件中添加不是字符串文字但可能在运行时由您的应用程序使用的其他字符串可能仍然有益。

符号数据应由jcmd附加到正在运行的JVM进程工具生成参见jcmd

以下是中的符号转储命令的示例jcmd

jcmd pid VM.symboltable -verbose

注意:@VERSION ...jcmd输出的第一行(进程ID)和第二行(应该从配置文件中排除。

配置文件示例

以下是配置文件的示例:

VERSION: 1.0
@SECTION: Symbol
10 -1: linkMethod

在配置文件示例中,@SECTION: Symbol条目使用以下格式:

长度 引用计数: 符号

共享符号引用计数始终为-1

@SECTION指定其后的节的类型。该部分中的所有数据必须与所指定的类型相同@SECTION不能混合使用不同类型的数据。@SECTION一个中允许多个不同的相同类型的数据段,由不同的指定shared_config_file

性能调优示例

您可以使用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:成功完成

  • >0:发生错误

英文原址: https://docs.oracle.com/en/java/javase/14/docs/specs/man/java.html#performance-tuning-examples 

posted @ 2020-11-04 09:07  如.若  阅读(604)  评论(0编辑  收藏  举报