java知多少,java文档

  官网地址: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...] 

[options]

可选:指定由空格分隔的命令行选项。有关可用选项的说明,请参阅Java 选项概述。

mainclass

指定要启动的类的名称。下面的命令行条目classname是 main 方法的参数。

-jar jarfile

执行封装在 JAR 文件中的程序。参数jarfile是 JAR 文件的名称,该文件的清单包含一行,该行的格式定义了类以及作为应用程序起点的方法。当您使用 时,指定的 JAR 文件是所有用户类的源,并且其他类路径设置将被忽略。如果您使用 JAR 文件,请参阅jar。 Main-Class:classnamepublic static void main(String[] args)-jar

-m或者--module module[/mainclass]

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

请参阅Java 的标准选项。

source-file

仅用于启动单个源文件程序。使用源文件模式时指定包含主类的源文件。请参阅使用源文件模式启动单文件源代码程序

[args...]

可选:mainclasssource-file、和or后面的参数作为参数传递给主类。 -jar jarfile-m--module module/mainclass

描述

java命令启动 Java 应用程序。它通过启动 Java 运行时环境 (JRE)、加载指定的类并调用该类的main()方法来实现此目的。该方法必须声明为publicand static,它不能返回任何值,并且必须接受String数组作为参数。方法声明具有以下形式:

public static void main(String[] args)

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

笔记:

您可以使用JDK_JAVA_OPTIONS启动器环境变量将其内容添加到启动器的实际命令行中java。请参阅使用 JDK_JAVA_OPTIONS 启动程序环境变量。

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

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

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

要启动源文件中声明的类,请java在源文件模式下运行启动器。进入源文件模式由命令行上的两项决定java
  • 命令行上的第一项不是选项或选项的一部分。换句话说,命令行中的项目本来是主类名称。

  • 该选项(如果存在)。 --source version

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

笔记:

每个版本的N有效值都会发生变化,添加新值并删除旧值。如果您使用不再受支持的N值,您将收到一条错误消息。此版本支持的N6值为、7891011

如果文件没有.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:预览语言和 VM 功能--enable-preview中描述的选项。

  • 没有规定将任何附加选项传递给编译器,例如-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())。这些被添加到传递给启动器的命令行参数之前javajava环境变量的编码要求与系统上的命令行相同。JDK_JAVA_OPTIONS环境变量内容的处理方式与命令行中指定的方式相同。

单引号 ( ') 或双"引号 ( ) 可用于括起包含空格字符的参数。只需删除一对引号即可保留开引号和第一个匹配的闭引号之间的所有内容。如果未找到匹配的引用,启动器将中止并显示错误消息。@- 支持在命令行中指定的文件。但是,与@-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.

  • Java 的高级运行时选项:控制 Java HotSpot VM 的运行时行为。

  • java 的高级 JIT 编译器选项:控制 Java HotSpot VM 执行的动态即时 (JIT) 编译。

  • Java 的高级可维护性选项:能够收集系统信息并执行广泛的调试。

  • Java 的高级垃圾收集选项:控制 Java HotSpot 执行垃圾收集 (GC) 的方式

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

对于需要参数的选项,参数可以通过空格、冒号 (:) 或等号 (=) 与选项名称分隔,或者参数可以直接跟在选项后面(每个选项的确切语法有所不同) )。如果您希望以字节为单位指定大小,则可以不使用后缀,或者使用后缀kor表示K千字节 (KB)、mM字节 (MB) 或gG千兆字节 (GB)。例如,要将大小设置为 8 GB,您可以指定8g8192m8388608k8589934592作为参数。如果您希望指定百分比,请使用 0 到 1 之间的数字。例如,指定0.25为 25%。

以下部分描述了已过时、已弃用和已删除的选项:

  • 已弃用的 Java 选项:接受并采取行动 — 使用它们时会发出警告。

  • 过时的 Java 选项:接受但忽略 — 使用它们时会发出警告。

  • 已删除的 Java 选项:已删除 — 使用它们会导致错误。

Java 的标准选项

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

笔记:

要为长选项指定参数,可以使用或。 --name=value--name value

-agentlib:libname[=options]

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

  • Oracle Solaris、Linux 和 macOS:如果指定了该选项-agentlib:foo,则 JVM 将尝试加载libfoo.so在系统变量指定的位置中LD_LIBRARY_PATH(在 macOS 上此变量为DYLD_LIBRARY_PATH)。

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

    以下示例显示如何加载 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会覆盖环境变量的任何设置CLASSPATH。如果未使用且未设置类路径选项classpath,则用户类路径由当前目录 (.) 组成。

.jar为了特别方便,包含星号 (*) 基本名称的类路径元素被视为等效于指定目录中扩展名为或的所有文件的列表.JAR。Java 程序无法区分这两个调用之间的区别。例如,如果目录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 module[,module...]

指定除初始模块之外还要解析的根模块。module也可以是ALL-DEFAULTALL-SYSTEM、 和ALL-MODULE-PATH

--list-modules

列出可观察的模块,然后退出。

-d module name或者--describe-module module_name

描述指定模块然后退出。

--dry-run

创建VM但不执行main方法。此--dry-run选项对于验证命令行选项(例如模块系统配置)可能很有用。

--validate-modules

验证所有模块并退出。此选项有助于查找模块路径上模块的冲突和其他错误。

-Dproperty=value

设置系统属性值。该property变量是一个不带空格的字符串,表示属性的名称。该value变量是表示属性值的字符串。如果value是带有空格的字符串,则将其用引号引起来(例如-Dfoo="foo bar")。

-disableassertions[:[packagename]...|:classname]或者-da[:[packagename]...|:classname]

禁用断言。默认情况下,所有包和类中都禁用断言。如果没有参数,-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[:[packagename]...|:classname]或者-ea[:[packagename]...|:classname]

启用断言。默认情况下,所有包和类中都禁用断言。如果没有参数,-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[=options]

加载指定的 Java 编程语言代理。

--show-version

将产品版本打印到输出流并继续。

-showversion

将产品版本打印到错误流并继续。

--show-module-resolution

显示启动期间的模块分辨率输出。

-splash:imagepath

显示带有指定图像的启动屏幕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

@指定命令使用的一个或多个前缀为 的参数文件javajava由于.jar类路径中需要文件,命令行很长的情况并不罕见。该选项使启动器能够在 shell 扩展之后、参数处理之前扩展参数文件的内容,从而克服了命令行长度限制。参数文件中的内容被扩展,因为否则,它们将在命令行上指定,直到遇到该选项。 @argfile-Xdisable-@files

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

java @argfile

有关使用 的说明和示例,请参阅java 命令行参数文件。 @argfile

Java 的额外选项

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

-Xbatch

禁用后台编译。默认情况下,JVM 将方法编译为后台任务,以解释器模式运行该方法,直到后台编译完成。该-Xbatch标志禁用后台编译,以便所有方法的编译作为前台任务继续进行,直到完成。该选项相当于-XX:-BackgroundCompilation.

-Xbootclasspath/a:directories|zip|JAR-files

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

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

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

-Xcheck:jni

对 Java 本机接口 (JNI) 函数执行附加检查。具体来说,它在处理 JNI 请求之前验证传递给 JNI 函数的参数和运行时环境数据。它还检查 JNI 调用之间未决的异常。遇到任何无效数据都表明本机代码中存在问题,在这种情况下,JVM 将终止并出现不可恢复的错误。使用此选项时,预计性能会下降。

-Xcomp

在第一次调用时强制编译方法。默认情况下,客户端 VM ( -client) 执行 1,000 次解释方法调用,服务器 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

设置年轻代(托儿所)堆的初始大小和最大大小(以字节为单位)。附加字母korK来指示千字节,m或者M指示兆字节,g或者G来表示千兆字节。堆的年轻代区域用于新对象。GC 在该区域中执行的频率高于其他区域。如果年轻代的大小太小,则会执行大量次要垃圾收集。如果大小太大,则仅执行完整垃圾收集,这可能需要很长时间才能完成。Oracle 建议您将年轻代的大小保持在总堆大小的 25% 以上且小于 50% 之间。以下示例展示了如何使用各种单位将年轻代的初始大小和最大大小设置为 256 MB:

-Xmn256m
-Xmn262144k
-Xmn268435456

您可以使用设置初始大小和设置最大大小,而不是同时设置-Xmn年轻代堆的-XX:NewSize初始大小和-XX:MaxNewSize最大大小的选项。

-Xms size

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

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

笔记:

-XX:InitalHeapSize选项还可用于设置初始堆大小。如果它出现 -Xms在命令行上,则初始堆大小将设置为使用 指定的值 -XX:InitalHeapSize

-Xmx size

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

-Xmx83886080
-Xmx81920k
-Xmx80m

-Xmx选项相当于-XX:MaxHeapSize.

-Xnoclassgc

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

-Xrs

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

  • Oracle Solaris、Linux 和 macOS:

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

    • 嵌入 JVM 的应用程序经常需要捕获诸如SIGINT或 之类的信号SIGTERM,这可能会导致对 JVM 信号处理程序的干扰。该-Xrs选项可用于解决此问题。当-Xrs使用 时,JVM 不会更改 SIGINTSIGTERMSIGHUP和的信号掩码,并且不会安装这些信号的信号处理程序。SIGQUIT

  • 视窗:

    • JVM 监视控制台控制事件以实现关闭挂钩以防止意外终止。具体来说,JVM 注册一个控制台控制处理程序,该处理程序开始关闭挂钩处理并TRUE返回CTRL_C_EVENTCTRL_CLOSE_EVENTCTRL_LOGOFF_EVENTCTRL_SHUTDOWN_EVENT

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

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

指定有两个后果-Xrs

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

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

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

-Xshare:mode

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

此选项的可能mode参数包括以下内容:

auto

如果可能,使用 CDS。这是 Java HotSpot 32 位客户端 VM 的默认值。

on

需要使用 CDS。如果无法使用类数据共享,此选项将打印一条错误消息并退出。

笔记:

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

off

指示不要使用 CDS。

-XshowSettings

显示所有设置,然后继续。

-XshowSettings:category

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

all

显示所有类别的设置。这是默认值。

locale

显示与区域设置相关的设置。

properties

显示与系统属性相关的设置。

vm

显示 JVM 的设置。

system

Linux:显示主机系统或容器配置并继续。

-Xss size

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

  • Linux/x64(64 位):1024 KB

  • macOS(64 位):1024 KB

  • Oracle Solaris/x64(64 位):1024 KB

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

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

-Xss1m
-Xss1024k
-Xss1048576

该选项类似于 -XX:ThreadStackSize.

-Xverify

设置字节码验证器的模式。

--add-reads module=target-module(,target-module)*

更新module以读取target-module,无论模块声明如何。target-module可以全部未命名来读取所有未命名的模块。

--add-exports module/package=target-module(,target-module)*

更新module导出packagetarget-module,无论模块声明如何。可以target-module全部未命名,导出到所有未命名的模块。

--add-opens module/package=target-module(,target-module)*

更新module为 open packageto target-module,无论模块声明如何。

--illegal-access=parameter

当存在于运行时时,--illegal-access=采用关键字parameter来指定操作模式:

笔记:

该选项将在未来版本中删除。

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

  • warn:此模式与 相同,permit只是为每个非法反射访问操作发出警告消息。

  • debug:此模式与 相同,warn只是针对每个非法反射访问操作都会发出警告消息和堆栈跟踪。

  • 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 module[,module...]

指定可观察模块范围的限制。

--patch-module module=file(;file)*

使用 JAR 文件或目录中的类和资源覆盖或增强模块。

--disable-@files

可以在命令行的任何位置使用,包括在参数文件中,以防止进一步扩展。此选项在选项之后停止扩展 -argfiles。 @filename@

--source version

在源文件模式下设置源的版本。

适用于 macOS 的额外选项

以下额外选项特定于 macOS。

-XstartOnFirstThread

main()在第一个 (AppKit) 线程上 运行该方法。

-Xdock:name=application_name

覆盖扩展坞中显示的默认应用程序名称。

-Xdock:icon=path_to_icon_file

覆盖 Dock 中显示的默认图标。

Java 的高级运行时选项

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

-XX:ActiveProcessorCount=x

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

VM 通常确定操作系统可用处理器的数量。在 docker 容器中运行多个 Java 进程时,此标志对于划分 CPU 资源非常有用。即使UseContainerSupport未启用此标志,也会受到尊重。请参阅-XX:-UseContainerSupport参考资料 来了解启用和禁用容器支持的说明。

--XX:AllocateHeapAt=path

获取文件系统的路径并使用内存映射在内存设备上分配对象堆。使用此选项使 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:CompilerDirectivesFile=file

当程序启动时,将文件中的指令添加到指令堆栈中。请参阅编译器指令和命令行。

-XX:CompilerDirectivesPrint

当程序启动或添加新指令时打印指令堆栈。

-XX:ConcGCThreads=n

设置并行标记线程的数量。设置n为并行垃圾收集线程 (ParallelGCThreads) 数量的大约 1/4。

-XX:+DisableAttachMechanism

禁用让工具附加到 JVM 的机制。默认情况下,此选项处于禁用状态,这意味着附加机制已启用,您可以使用诊断和故障排除工具,例如jcmdjstackjmapjinfo

笔记:

使用一个 JDK 版本中的工具对不同 JDK 版本进行故障排除时,不支持 JDK 附带的 jcmd、jinfo、jmap和jstack 等工具。

-XX:ErrorFile=filename

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

以下示例显示如何设置默认日志文件(注意进程的标识符指定为%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:+FailOverToOldVerifier

当新类型检查器失败时,启用自动故障转移到旧验证器。默认情况下,此选项处于禁用状态,并且对于具有最新字节码版本的类,它会被忽略(即被视为禁用)。您可以为具有旧版本字节码的类启用它。

-XX:+FlightRecorder

允许在应用程序运行时使用 Java Flight Recorder (JFR)。

笔记:

-XX:+FlightRecorder使用 JFR 不再需要该选项。这是 JDK 8u40 中所做的更改。

-XX:FlightRecorderOptions=parameter=value

设置控制 JFR 行为的参数。

以下列表包含可用的 JFR条目: parameter=value

allow_threadbuffers_to_disk={true|false}

指定如果缓冲区线程被阻塞,线程缓冲区是否直接写入磁盘。默认情况下,该参数处于禁用状态。

globalbuffersize=size

指定用于数据保留的主内存总量。默认值基于为 指定的值memorysize。更改memorysize参数以改变全局缓冲区的大小。

maxchunksize=size

指定记录中数据块的最大大小(以字节为单位)。附加mM以兆字节 (MB) 为单位指定大小,或gG千兆字节 (GB) 为单位指定大小。默认情况下,数据块的最大大小设置为 12 MB。允许的最小值为 1 MB。

memorysize=size

确定应使用多少缓冲区内存,并根据指定的大小设置globalbuffersize和参数。numglobalbuffers附加mM以兆字节 (MB) 为单位指定大小,或gG千兆字节 (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 KB。覆盖此参数可能会降低性能,因此不建议这样做。

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

-XX:InitiatingHeapOccupancyPercent=n

设置触发标记周期的Java堆占用阈值。默认占用率为整个 Java 堆的 45%。

-XX:LargePageSizeInBytes=size

Oracle Solaris:设置用于 Java 堆的大页面的最大大小(以字节为单位)。该size参数必须是 2 的幂(2、4、8、16 等)。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。默认情况下,大小设置为 0,这意味着 JVM 自动选择大页面的大小。请参阅大页面。

以下示例介绍如何将大页大小设置为 4 兆字节 (MB):

-XX:LargePageSizeInBytes=4m

-XX:MaxDirectMemorySize=size

java.nio设置包、直接缓冲区分配的最大总大小(以字节为单位) 。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。默认情况下,大小设置为 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

笔记:

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

-XX:OnError=string

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

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

    -XX:OnError="gcore %p;dbx - %p"
  • Windows:以下示例显示如何-XX:OnError使用该选项运行userdump.exe实用程序以在出现不可恢复的错误(指定%p当前进程)时获取故障转储。userdump.exe此示例假设在环境变量中指定了实用程序的路径PATH

    -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

当启用本机内存跟踪时,可以在 JVM 退出时打印收集的本机内存跟踪数据(请参阅 参考资料-XX:NativeMemoryTracking)。默认情况下,此选项处于禁用状态,并且不会打印本机内存跟踪数据。

-XX:+RelaxAccessControlCheck

减少验证器中的访问控制检查量。默认情况下,此选项处于禁用状态,并且对于具有最新字节码版本的类,它会被忽略(即被视为禁用)。您可以为具有旧版本字节码的类启用它。

-XX:SharedArchiveFile=path

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

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

-XX:SharedArchiveConfigFile=shared_config_file

指定添加到存档文件中的其他共享数据。

-XX:SharedClassListFile=file_name

指定包含要存储在类数据共享 (CDS) 存档中的类名称的文本文件。该文件每行包含一个类的全名,除了斜线 ( /) 替换点 ( .) 之外。例如,要指定类java.lang.Objecthello.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}

指定是否将临时数据写入磁盘存储库。默认情况下,该参数设置为false。要启用它,请将参数设置为true

dumponexit={true|false}

指定当 JVM 关闭时是否转储正在运行的记录。如果启用且未输入 a filename,则录制内容将写入进程启动目录中的文件中。文件名是系统生成的名称,包含进程 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。该值不得小于通过maxchunksize设定的参数值-XX:FlightRecorderOptions。附加mM指定大小(以兆字节为单位),或g指定G大小(以千兆字节为单位)。默认情况下,磁盘数据的最大大小不受限制,该参数设置为0

path-to-gc-roots=truefalse}

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

GC root 的路径对于查找内存泄漏很有用,但收集它很耗时。仅当您开始录制您怀疑存在内存泄漏的应用程序时,才启用此选项。如果该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

  • 苹果系统:1024 KB

  • Oracle Solaris:1024 KB

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

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

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

该选项类似于-Xss.

-XX:-UseBiasedLocking

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

默认情况下,此选项处于启用状态。

-XX:-UseCompressedOops

禁用压缩指针的使用。默认情况下,启用此选项,并且当 Java 堆大小小于 32 GB 时使用压缩指针。启用此选项后,对象引用表示为 32 位偏移量而不是 64 位指针,这通常会提高运行 Java 堆大小小于 32 GB 的应用程序时的性能。此选项仅适用于 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

允许在线程状态转换时发出 membar。默认情况下,除启用该选项的 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.

java 的高级 JIT 编译器选项

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

-XX:AllocateInstancePrefetchLines=lines

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

-XX:AllocateInstancePrefetchLines=1

仅 Java HotSpot Server VM 支持此选项。

-XX:AllocatePrefetchDistance=size

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

负值表示预取距离是根据平台选择的。正值是要预取的字节。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。默认值设置为-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:AllocatePrefetchStepSize=size

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

-XX:AllocatePrefetchStepSize=16

仅 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]

指定 acommand对 a 执行method。例如,要排除类indexOf()的方法String被编译,请使用以下命令:

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

请注意,指定了完整的类名,包括由斜杠 ( /) 分隔的所有包和子包。为了更轻松地进行剪切和粘贴操作,还可以使用-XX:+PrintCompilation-XX:+LogCompilation选项生成的方法名称格式:

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

如果指定的方法没有签名,则该命令将应用于具有指定名称的所有方法。但是,您也可以在类文件格式中指定方法的签名。在这种情况下,您应该将参数括在引号中,否则 shell 会将分号视为命令结束。例如,如果您只想从编译中排除类 indexOf(String)的方法,请使用以下命令: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 编译选项传递给指定的方法来代替最后一个参数 ( 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=filename

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

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

print java/lang/String toString

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

-XX:CompileOnly=methods

设置应限制编译的方法列表(以逗号分隔)。仅编译指定的方法。使用完整的类名指定每个方法(包括包和子包)。例如,要仅编译类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:CompileThreshold=invocations

设置编译前解释方法调用的数量。默认情况下,在服务器 JVM 中,JIT 编译器执行 10,000 个解释方法调用以收集信息以进行高效编译。对于客户端 JVM,默认设置为 1,500 次调用。当启用分层编译时,该选项将被忽略。查看选项-XX:-TieredCompilation。以下示例显示如何将解释方法调用的数量设置为 5,000:

-XX:CompileThreshold=5000

您可以通过指定选项在编译之前完全禁用 Java 方法的解释-Xcomp

-XX:CompileThresholdScaling=scale

提供首次编译的统一控制。此选项控制何时首次为分层和非分层操作模式编译方法。该CompileThresholdScaling选项具有 0 到 +Inf 之间的整数值,并缩放与当前操作模式(分层和非分层)相对应的阈值。设置CompileThresholdScaling为小于 1.0 的值会导致较早编译,而设置为大于 1.0 的值会延迟编译。设置CompileThresholdScaling为0相当于禁用编译。

-XX:+DoEscapeAnalysis

允许使用逃逸分析。默认情况下启用此选项。要禁用逃逸分析,请指定-XX:-DoEscapeAnalysis。仅 Java HotSpot Server VM 支持此选项。

-XX:InitialCodeCacheSize=size

设置初始代码缓存大小(以字节为单位)。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。默认值设置为 500 KB。初始代码缓存大小不应小于系统的最小内存页大小。以下示例显示如何将初始代码缓存大小设置为 32 KB:

-XX:InitialCodeCacheSize=32k

-XX:+Inline

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

-XX:InlineSmallCode=size

设置应内联的已编译方法的最大代码大小(以字节为单位)。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。仅内联大小小于指定大小的已编译方法。默认情况下,最大代码大小设置为 1000 字节:

-XX:InlineSmallCode=1000

-XX:+LogCompilation

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

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

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

-XX:MaxInlineSize=size

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

-XX:MaxInlineSize=35

-XX:MaxNodeLimit=nodes

设置单个方法编译期间要使用的最大节点数。默认情况下,最大节点数设置为 65,000:

-XX:MaxNodeLimit=65000

-XX:NonNMethodCodeHeapSize=size

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

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

—XX:NonProfiledCodeHeapSize=size

设置包含非分析方法的代码段的大小(以字节为单位)。—XX:SegmentedCodeCache仅当启用时才 使用该标志。

-XX:MaxTrivialSize=size

设置要内联的普通方法的最大字节码大小(以字节为单位)。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。默认情况下,普通方法的最大字节码大小设置为 6 个字节:

-XX:MaxTrivialSize=6

-XX:+OptimizeStringConcat

启用串联操作的优化String。默认情况下启用此选项。String要禁用串联操作的优化,请指定-XX:-OptimizeStringConcat。仅 Java HotSpot Server VM 支持此选项。

-XX:+PrintAssembly

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

默认情况下,此选项处于禁用状态并且不会打印汇编代码。该-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 编译代码的最大代码缓存大小(以字节为单位)。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。默认最大代码缓存大小为 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。客户端 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 内在函数是为计算 ( ) 表达式的值的方法生成的。 java.lang.Math.fma(abc)a * b + c

-XX:+UseRTMDeopt

根据中止率自动调整 RTM 锁定。该比率由选项指定-XX:RTMAbortRatio。如果中止事务的数量超过中止比率,则包含该锁的方法将被取消优化并重新编译,所有锁都作为普通锁。默认情况下禁用此选项。-XX:+UseRTMLocking必须启用 该选项。

-XX:+UseRTMLocking

为所有膨胀锁生成受限事务内存 (RTM) 锁定代码,并使用正常锁定机制作为后备处理程序。默认情况下禁用此选项。与 RTM 相关的选项仅适用于支持事务同步扩展 (TSX) 的 x86 CPU 上的 Java HotSpot Server VM。

RTM 是 Intel TSX 的一部分,它是 x86 指令集扩展,有助于创建多线程应用程序。RTM 引入了新指令XBEGINXABORTXENDXTEST。和XBEGIN指令XEND包含一组作为事务运行的指令。如果运行事务时未发现冲突,则内存和寄存器修改将在XEND指令处一起提交。该XABORT指令可用于显式中止事务,并且该XEND指令检查事务中是否正在运行一组指令。

当另一个线程尝试访问同一事务时,事务上的锁就会膨胀,从而阻塞最初未请求访问该事务的线程。RTM 要求指定一组后备操作,以防事务中止或失败。RTM 锁是已委托给 TSX 系统的锁。

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

-XX:+UseSHA

为 SPARC 硬件的 SHA 加密哈希函数启用基于硬件的内在函数。该选项与、、 和选项UseSHA结合使用。 UseSHA1IntrinsicsUseSHA256IntrinsicsUseSHA512Intrinsics

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

允许将标量运算转换为超字运算。Superword 是一种矢量化优化。默认情况下启用此选项。要禁用标量运算到超字运算的转换,请指定-XX:-UseSuperWord。仅 Java HotSpot Server VM 支持此选项。

Java 的高级可维护性选项

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

-XX:+ExtendedDTraceProbes

Oracle Solaris、Linux 和 macOS:启用dtrace影响性能的其他工具探测。默认情况下,此选项处于禁用状态并且dtrace仅执行标准探测。

-XX:+HeapDumpOnOutOfMemoryError

java.lang.OutOfMemoryError抛出异常时,可以使用堆分析器 (HPROF) 将 Java 堆转储到当前目录中的文件。您可以使用该选项显式设置堆转储文件路径和名称-XX:HeapDumpPathOutOfMemoryError默认情况下,此选项处于禁用状态,并且抛出异常 时不会转储堆。

-XX:HeapDumpPath=path

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

设置写入日志数据的路径和文件名。默认情况下,该文件在当前工作目录中创建,并命名为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

  • 窗口 Control+C:( SIGTERM)

默认情况下,此选项处于禁用状态。

设置该选项相当于运行jmap -histo命令,或者命令,其中是当前Java进程标识符。 jcmd pid GC.class_histogrampid

-XX:+PrintConcurrentLocks

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

  • Oracle Solaris、Linux 和 macOS: Control+Break

  • 窗口 Control+C:( SIGTERM)

默认情况下,此选项处于禁用状态。

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

-XX:+PrintFlagsRanges

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

-XX:+UnlockDiagnosticVMOptions

解锁用于诊断 JVM 的选项。默认情况下,此选项处于禁用状态并且诊断选项不可用。

Java 的高级垃圾收集选项

这些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

-XX:MinHeapFreeRatio设置在 CMS 收集周期开始之前分配的选项指定的值的百分比(0 到 100) 。默认值设置为 80%。

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

-XX:CMSTriggerRatio=75
-XX:ConcGCThreads=threads

设置用于并发 GC 的线程数。设置threads为并行垃圾收集线程数的大约 1/4。默认值取决于 JVM 可用的 CPU 数量。

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

-XX:+DisableExplicitGC

启用禁用处理方法调用的选项System.gc()。默认情况下禁用此选项,这意味着将处理对的调用System.gc()。如果禁用处理调用System.gc(),则 JVM 仍会在必要时执行 GC。

-XX:+ExplicitGCInvokesConcurrent

允许使用请求调用并发GC System.gc()。默认情况下此选项处于禁用状态,只能通过已弃用的-XX:+UseConcMarkSweepGC选项和-XX:+UseG1GC选项来启用。

-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses

允许在并发 GCSystem.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 build 23 或更早版本中不可用。

-XX:G1MixedGCCountTarget=number

设置标记周期后混合垃圾收集的目标数量,以收集最多包含G1MixedGCLIveThresholdPercent实时数据的旧区域。默认是 8 次混合垃圾回收。混合收集的目标是在这个目标数量之内。

此设置在 Java HotSpot VM build 23 或更早版本中不可用。

-XX:G1MixedGCLiveThresholdPercent=percent

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

这是一个实验性的标志。此设置取代了该-XX:G1OldCSetRegionLiveThresholdPercent设置。

此设置在 Java HotSpot VM build 23 或更早版本中不可用。

-XX:G1NewSizePercent=percent

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

这是一个实验性的标志。此设置取代了该-XX:DefaultMinNewGenPercent设置。

此设置在 Java HotSpot VM build 23 或更早版本中不可用。

-XX:G1OldCSetRegionThresholdPercent=percent

设置混合垃圾收集周期期间要收集的旧区域数量的上限。默认值为 Java 堆的 10%。

此设置在 Java HotSpot VM build 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。附加字母 korK表示千字节, mM表示兆字节,和 gG表示千兆字节。默认值是在运行时根据系统配置选择的。请参阅Java SE HotSpot 虚拟机垃圾收集调优指南中的人体工程学部分。

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

-XX:InitialHeapSize=6291456
-XX:InitialHeapSize=6144k
-XX:InitialHeapSize=6m
如果将此选项设置为 0,则初始大小将设置为老年代和年轻代分配的大小之和。年轻代的堆大小可以使用该 -XX:NewSize选项设置。

笔记:

-Xms 选项设置堆的最小堆大小和初始堆大小。如果-Xms出现 -XX:InitialHeapSize在命令行上,则初始堆大小将设置为使用 指定的值 -Xms

-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

设置启动并发 GC 周期的堆占用百分比(0 到 100)。它由垃圾收集器使用,根据整个堆的占用情况(而不仅仅是某一代的占用情况)触发并发 GC 周期(例如,G1 垃圾收集器)。

默认情况下,初始值设置为 45%。值 0 表示不间断 GC 循环。以下示例显示如何将初始堆占用率设置为 75%:

-XX:InitiatingHeapOccupancyPercent=75

-XX:MaxGCPauseMillis=time

设置最大 GC 暂停时间的目标(以毫秒为单位)。这是一个软目标,JVM会尽最大努力来实现它。指定的值不适合您的堆大小。默认情况下,没有最大暂停时间值。

以下示例显示如何将最大目标暂停时间设置为 500 毫秒:

-XX:MaxGCPauseMillis=500

-XX:MaxHeapSize=size

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

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

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

在 Oracle Solaris 7 和 Oracle Solaris 8 SPARC 平台上,该值的上限约为 4,000 MB 减去开销金额。在 Oracle Solaris 2.6 和 x86 平台上,上限约为 2,000 MB 减去开销金额。在 Linux 平台上,上限约为 2,000 MB 减去开销量。

-XX:MaxHeapSize选项相当于-Xmx.

-XX:MaxHeapFreeRatio=percent

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

通过使用命令行选项和降低参数值MaxHeapFreeRatio(默认值为 70%) 和(默认值为 40%),最小化 Java 堆大小。降低至低至 10% 和5% 已成功减小堆大小,且性能没有太大下降;然而,根据您的应用,结果可能会有很大差异。尝试这些参数的不同值,直到它们尽可能低但仍保持可接受的性能。 MinHeapFreeRatio-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatioMaxHeapFreeRatioMinHeapFreeRatio

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

想要保持堆较小的客户还应该添加该选项-XX:-ShrinkHeapInSteps。有关使用此选项通过减少嵌入式应用程序的动态占用空间来保持 Java 堆较小的说明,请 参阅性能调优示例。

-XX:MaxMetaspaceSize=size

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

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

-XX:MaxMetaspaceSize=256m

-XX:MaxNewSize=size

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

-XX:MaxTenuringThreshold=threshold

设置用于自适应 GC 大小调整的最大保留阈值。最大值为 15。并行(吞吐量)收集器的默认值为 15,CMS 收集器的默认值为 6。

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

-XX:MaxTenuringThreshold=10

-XX:MetaspaceSize=size

设置分配的类元数据空间的大小,第一次超出时触发垃圾收集。垃圾收集的该阈值根据所使用的元数据的量而增加或减少。默认大小取决于平台。

-XX:MinHeapFreeRatio=percent

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

通过使用命令行选项和降低参数值MaxHeapFreeRatio(默认值为 70%)和(默认值为 40%)来最小化 Java 堆大小。降低至低至 10% 和5% 已成功减小堆大小,且性能没有太大下降;然而,根据您的应用,结果可能会有很大差异。尝试这些参数的不同值,直到它们尽可能低,但仍保持可接受的性能。 MinHeapFreeRatio-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatioMaxHeapFreeRatioMinHeapFreeRatio

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

想要保持堆较小的客户还应该添加该选项-XX:-ShrinkHeapInSteps。有关使用此选项通过减少嵌入式应用程序的动态占用空间来保持 Java 堆较小的说明,请 参阅性能调优示例。

-XX:NewRatio=ratio

设置新生代和老年代大小之间的比率。默认情况下,此选项设置为 2。以下示例显示如何将 young-to-old 比率设置为 1:

-XX:NewRatio=1

-XX:NewSize=size

设置年轻代(托儿所)的堆的初始大小(以字节为单位)。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。

堆的年轻代区域用于新对象。GC 在该区域中执行的频率高于其他区域。如果年轻代的大小太小,则会执行大量的 Minor GC。如果大小太高,则仅执行完整 GC,这可能需要很长时间才能完成。Oracle 建议您将年轻代的大小保持在总堆大小的 25% 以上且小于 50% 之间。

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

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

-XX:NewSize选项相当于-Xmn.

-XX:ParallelGCThreads=threads

设置停止世界 (STW) 工作线程的值。此选项将 的值设置threads为逻辑处理器的数量。的值threads与逻辑处理器的数量相同,最多为 8。

如果逻辑处理器数量超过 8 个,则此选项将 的值设置threads为逻辑处理器的大约 5/8。这在大多数情况下都适用,但较大的 SPARC 系统除外,其中 的值threads约为逻辑处理器的 5/16。

默认值取决于 JVM 可用的 CPU 数量。

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

-XX:ParallelGCThreads=2

-XX:+ParallelRefProcEnabled

启用并行参考处理。默认情况下,此选项处于禁用状态。

-XX:+PrintAdaptiveSizePolicy

启用有关自适应生成大小调整的信息的打印。默认情况下,此选项处于禁用状态。

-XX:+ScavengeBeforeFullGC

在每次full GC之前启用年轻代的GC。默认情况下启用此选项。Oracle 建议您不要禁用它,因为在 Full GC 之前清除年轻代可以减少从老年代空间到达年轻代空间的对象数量。要在每次完整 GC 之前禁用年轻代的 GC,请指定选项-XX:-ScavengeBeforeFullGC

-XX:-ShrinkHeapInSteps

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

请参阅性能调优示例,了解如何使用该MaxHeapFreeRatio选项通过减少嵌入式应用程序的动态占用空间来保持较小的 Java 堆。

–XX:StringDeduplicationAgeThreshold=threshold

识别String达到指定年龄且被视为重复数据删除候选对象的对象。对象的年龄是衡量它在垃圾回收中幸存下来的次数的指标。这有时被称为终身任职。请参阅已弃用的-XX:+PrintTenuringDistribution选项。

笔记:

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

-XX:SurvivorRatio=ratio

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

-XX:SurvivorRatio=4

-XX:TargetSurvivorRatio=percent

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

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

-XX:TargetSurvivorRatio=30

-XX:TLABSize=size

设置线程本地分配缓冲区 (TLAB) 的初始大小(以字节为单位)。附加字母korK表示千字节,mM表示兆字节,和gG表示千兆字节。如果此选项设置为 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

允许使用限制OutOfMemoryError抛出异常之前 JVM 在 GC 上花费的时间比例的策略。默认情况下启用此选项,OutOfMemoryError如果总时间的 98% 以上用于垃圾回收并且回收的堆量少于 2%,则并行 GC 将抛出异常。当堆较小时,此功能可用于防止应用程序长时间运行而进展很少或没有进展。要禁用此选项,请指定选项-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

已弃用的 Java 选项

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

-Xloggc:filename

设置应将详细 GC 事件信息重定向到的文件以进行日志记录。写入此文件的信息类似于-verbose:gc自每个记录事件之前的第一个 GC 事件以来经过的时间的输出。如果使用相同的命令给出两个选项,则该-Xloggc选项将被覆盖。 -verbose:gcjava

例子:

-Xlog:gc:garbage-collection.log

-XX:CMSInitiatingOccupancyFraction=percent

设置开始 CMS 收集周期的老年代占用百分比(0 到 100)。默认值设置为-1。任何负值(包括默认值)都意味着该选项-XX:CMSTriggerRatio用于定义初始占用率的值。

以下示例显示如何将占用率设置为 20%:

-XX:CMSInitiatingOccupancyFraction=20

-XX:CMSInitiatingPermOccupancyFraction=percent

设置启动 GC 的永久代占用百分比(0 到 100)。该选项在 JDK 8 中已被弃用,并且没有替代方案。

-XX:+PrintStringDeduplicationStatistics

打印详细的重复数据删除统计数据。默认情况下,此选项处于禁用状态。查看-XX:+UseStringDeduplication选项。

-XX:+PrintTenuringDistribution

允许打印任期年龄信息。以下是输出示例:

Desired survivor size 48286924 bytes, new threshold 10 (max 10)
- age 1: 28992024 bytes, 28992024 total
- age 2: 1366864 bytes, 30358888 total
- age 3: 1425912 bytes, 31784800 total
...

年龄 1 的对象是最年轻的幸存者(它们是在上次清理后创建的,在最近一次清理中幸存下来,并从伊甸园移至幸存者空间)。年龄 2 的对象在两次清除中幸存下来(在第二次清除期间,它们被从一个幸存者空间复制到下一个)。对输出中的所有对象重复此模式。

在前面的示例中,28,992,024 字节在一次清理中幸存下来,并从 eden 复制到幸存者空间,1,366,864 字节被年龄 2 的对象占用,依此类推。每行中的第三个值是年龄为n或更小的对象的累积大小。

默认情况下,此选项处于禁用状态。

-XX:SoftRefLRUPolicyMSPerMB=time

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

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

-XX:SoftRefLRUPolicyMSPerMB=2500

-XX:+TraceClassLoading

启用类加载时的跟踪。默认情况下,此选项处于禁用状态并且不会跟踪类。

替代统一日志记录语法是。请参阅使用 JVM 统一日志记录框架启用日志记录-Xlog:class+load=level

使用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:+UseConcMarkSweepGC

允许对老一代使用 CMS 垃圾收集器。CMS 是默认垃圾收集器 (G1) 的替代方案,它也专注于满足应用程序延迟要求。默认情况下,此选项处于禁用状态,并且会根据计算机的配置和 JVM 类型自动选择收集器。CMS 垃圾收集器已弃用。

-XX:+UseParNewGC

允许在年轻代中使用并行线程进行收集。默认情况下,此选项处于禁用状态。当您设置该选项时,它会自动启用-XX:+UseConcMarkSweepGC。JDK 8 中不推荐-XX:+UseParNewGC使用不带该选项的选项。不推荐使用该选项的所有用途。不使用该选项是不可能的。 -XX:+UseConcMarkSweepGC-XX:+UseParNewGC-XX:+UseConcMarkSweepGC

-XX:+UseSplitVerifier

启用拆分验证过程。默认情况下,在以前的版本中启用此选项,并且验证分为两个阶段:类型引用(由编译器执行)和类型检查(由 JVM 运行时执行)。现在默认情况下会分割验证,无法禁用它。

过时的 Java 选项

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

-XX:+AggressiveOpts

允许使用积极的性能优化功能,预计这些功能将在即将发布的版本中成为默认功能。默认情况下,此选项处于禁用状态,并且不使用实验性性能功能。

-XX:+CheckEndorsedAndExtDirs

java如果以下任何目录存在且不为空,则 启用该选项以阻止命令运行 Java 应用程序:

  • lib/endorsed

  • lib/ext

  • 系统范围特定于平台的扩展目录

不再支持认可的标准覆盖机制和扩展机制。

-XX:MaxPermSize=size

设置最大永久代空间大小(以字节为单位)。此选项在 JDK 8 中已弃用并被该选项取代-XX:MaxMetaspaceSize

-XX:PermSize=size

设置分配给永久代的空间(以字节为单位),如果超出则触发垃圾收集。此选项在 JDK 8 中已弃用并被该选项取代-XX:MetaspaceSize

-XX:+UseAppCDS

如果应用程序类或平台类存在于类列表中并且共享存档是使用-Xshare:dump/auto/on. 将发出以下自定义警告消息,该消息与用于过时标志的标准警告略有不同:

Java HotSpot(TM) 64 位服务器 VM 警告:忽略过时的选项UseAppCDS;AppCDS 自动启用

删除了 Java 选项

这些java选项已在 JDK 11 中删除,使用它们会导致以下错误:
Unrecognized VM option option-name
有关先前版本中删除的选项的列表和说明,请参阅:
  • Java 平台,标准版工具参考,版本 10

  • Java 平台,标准版工具参考,版本 9

  • Java 平台,标准版工具参考,适用于 Windows 上的 Oracle JDK 的第 8 版

  • Java 平台,标准版工具参考,Solaris、Linux 和 OS X 上 Oracle JDK 的第 8 版

-XX:+ResourceManagement

不再支持。启用在应用程序运行时使用资源管理。

-XX:ResourceManagementSampleInterval=value_in_milliseconds

不再支持。设置控制资源管理测量采样间隔的参数(以毫秒为单位)。

仅当启用资源管理(即-XX:+ResourceManagement指定该选项)时才使用此选项。

java 命令行参数文件

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

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

启动java器扩展参数文件内容,直到遇到该-Xdisable-@files选项。-Xdisable-@files您可以在命令行上的任何位置(包括在参数文件中)使用该选项来停止 扩展。 @argument_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 代码。

  • 如果文件名包含嵌入空格,则将整个文件名放在双引号中。

  • 参数文件中的文件名是相对于当前目录的,而不是相对于参数文件的位置的。

  • #使用参数文件中的数字符号 ( ) 来标识注释。后面的所有字符都#将被忽略,直到行尾。

  • 前缀选项的附加 at 符号 ( @) 前缀@充当转义符(第一个@被删除,其余参数按字面意思呈现给启动器)。

  • \可以在行尾使用继续符 ( ) 来继续行。这两行连接在一起,并修剪了前导空格。为了防止修剪前导空格,\可以在第一列放置一个连续字符 ( )。

  • 由于反斜杠 ( \) 是转义字符,因此必须使用另一个反斜杠字符对反斜杠字符进行转义。

  • 允许部分引用,并以文件结尾结束。

  • 除非是最后一个字符,否则开引号会在行尾停止\,然后通过删除所有前导空白字符来连接下一行。

  • 这些列表中不允许使用通配符 (*)(例如指定*.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 [function] [granularity]
如果您只对运行示例工作负载后代码堆的外观感兴趣,则可以使用命令行选项:
-Xlog:codecache=Trace
要在存在“CodeCache full”情况时查看代码堆状态,请使用命令行选项启动 VM:
-Xlog:codecache=Debug

有关代码堆状态分析功能、支持的函数和粒度选项的详细说明,请 参阅CodeHeap State Analytics (OpenJDK) 。

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

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

概要

-Xlog[:[what][:[output][:[decorators][:output-options[,...]]]]]

what

tag1指定[+ tag2...][ *][= ][,...]形式的标签和级别的组合level。除非指定通配符 ( *),否则仅匹配完全带有指定标签的日志消息。请参阅-Xlog 标签和级别。

output

设置输出类型。省略output类型默认为stdout. 请参阅-Xlog 输出。

decorators

配置输出以使用一组自定义装饰器。省略decorators默认值uptimeleveltags。参见装饰品。

output-options

设置-Xlog日志输出选项。

描述

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

下面提供了-Xlog选项的命令和语法的快速参考:

-Xlog

在某个info级别启用 JVM 日志记录。

-Xlog:help

打印-Xlog用法语法和可用标签、级别和装饰器以及带有说明的示例命令行。

-Xlog:disable

关闭所有日志记录并清除日志记录框架的所有配置,包括警告和错误的默认配置。

-Xlog[:option]

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

设置option为:
[tag selection][:[output][:[decorators][:output-options]]]

省略tag selection标签集all和级别的默认值info

tag[+...] all

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

output_options
filecount=file-count filesize=file size with optional K, M or G suffix

默认配置

-Xlog命令行上未指定该选项且未指定任何其他内容时,将使用默认配置。默认配置会记录所有消息,其级别与警告或错误匹配,无论消息与什么标签关联。默认配置相当于在命令行中输入以下内容:

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

在运行时控制日志记录

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

-Xlog 标签和级别

每条日志消息都有一个级别和与其关联的标签集。消息的级别对应于其详细信息,标记集对应于消息包含的内容或涉及的 JVM 组件(例如 GC、编译器或线程)。将 GC 日志标志转换为 Xlog 中描述了将 GC 标志映射到 Xlog 配置。将运行时日志记录标志转换为Xlog 中描述了将旧版运行时日志记录标志映射到相应的 Xlog 配置。

可用的日志级别:

  • off

  • trace

  • debug

  • info

  • warning

  • error

可用的日志标签:

以下是可用的日志标签。指定all而不是标记组合匹配所有标记组合。
  • add

  • age

  • alloc

  • annotation

  • aot

  • arguments

  • attach

  • barrier

  • biasedlocking

  • blocks

  • bot

  • breakpoint

  • bytecode

  • census

  • class

  • classhisto

  • cleanup

  • compaction

  • comparator

  • constraints

  • constantpool

  • coops

  • cpu

  • cset

  • data

  • defaultmethods

  • dump

  • ergo

  • event

  • exceptions

  • exit

  • fingerprint

  • freelist

  • gc

  • hashtables

  • heap

  • humongous

  • ihop

  • iklass

  • init

  • itables

  • jfr

  • jni

  • jvmti

  • liveness

  • load

  • loader

  • logging

  • mark

  • marking

  • metadata

  • metaspace

  • method

  • mmu

  • modules

  • monitorinflation

  • monitormismatch

  • nmethod

  • normalize

  • objecttagging

  • obsolete

  • oopmap

  • os

  • pagesize

  • parser

  • patch

  • path

  • phases

  • plab

  • preorder

  • promotion

  • protectiondomain

  • purge

  • redefine

  • ref

  • refine

  • region

  • remset

  • resolve

  • safepoint

  • scavenge

  • scrub

  • setting

  • stackmap

  • stacktrace

  • stackwalk

  • start

  • startuptime

  • state

  • stats

  • stringdedup

  • stringtable

  • subclass

  • survivor

  • sweep

  • system

  • task

  • thread

  • time

  • timer

  • tlab

  • unload

  • update

  • verification

  • verify

  • vmoperation

  • vtables

  • workgang

下表描述了标签与日志级别的可能组合的列表。

日志标签 描述
-Xlog:gc 打印gc信息以及垃圾收集发生的时间。
-Xlog:gc*

打印至少包含gc标签的日志消息。它还可以具有与其关联的其他标签。但是,它不会提供phase级别信息。

-Xlog:gc*=trace 打印最低级别的gc日志记录信息。输出显示所有gc相关标签以及详细的日志记录信息。
-Xlog:gc+phases=debug

打印不同phase级别的信息。这给出了在该级别记录的信息的详细级别debug

-Xlog:gc+heap=debug

打印heap之前和之后的使用详细信息gc。这会记录标有gcheapatdebug级别的消息。

-Xlog:safepoint

打印同一级别的应用程序并发时间和应用程序停止时间的详细信息。

-Xlog:gc+ergo*=trace

gc在级别上打印和ergo消息的组合trace。该信息包括有关堆大小和集合集构造的所有详细信息。

-Xlog:gc+age=trace

age打印幸存者空间中幸存对象的大小和分布trace

-Xlog:gc*:file=::filecount=,filesize= 将输出重定向到文件,指定要使用的文件数以及文件的大小kb

-Xlog输出

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

  • stdout— 将输出发送到标准输出

  • stderr— 将输出发送到 stderr

  • file=filename— 将输出发送到文本文件。

使用 时,在文件名中指定和/或分别扩展为 JVM 的 PID 和启动时间戳。您还可以配置文本文件以根据文件大小和要旋转的文件数量来处理文件旋转。例如,要每 10 MB 轮换一次日志文件并轮换 5 个文件,请指定 options 。文件的目标大小不能保证准确,它只是一个近似值。默认情况下,文件会轮换最多 5 个目标大小为 20 MB 的轮换文件,除非另有配置。指定意味着不应轮换日志文件。预先存在的日志文件有可能被覆盖。 file=filename%p%tfilesize=10M, filecount=5filecount=0

装饰

记录消息用有关该消息的信息进行装饰。您可以配置每个输出以使用一组自定义装饰器。输出的顺序始终与表中列出的顺序相同。您可以配置要在运行时使用的装饰。装饰被添加到日志消息之前。例如:
[6.567s][info][gc,old] Old collection complete

省略decorators默认值uptimeleveltags。装饰none器比较特殊,用来关闭所有装饰。

timet)、utctimeutc)、uptimeu)、timemillistm)、uptimemillisum)、timenanostn)、 ( )、 uptimenanosun)、( )、hostname( ) 、( ) 、( )装饰器也可以指定为无装饰。 hnpidptidtilevelltagstgnone

表 2-1 可能的日志消息装饰

装饰 描述
time或者t

ISO-8601 格式的当前时间和日期。

utctime或者utc

协调世界时或协调世界时。

uptime或者u

自 JVM 启动以来的时间(以秒和毫秒为单位)。例如,6.567 秒。

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

表 2-2 将旧式垃圾收集日志记录标志映射到 Xlog 配置

旧版垃圾收集 (GC) 标志 Xlog配置 评论
G1PrintHeapRegions

-Xlog:gc+region=trace

不适用

GCLogFileSize

无可用配置

日志轮换由框架处理。
NumberOfGCLogFiles

不适用

日志轮换由框架处理。
PrintAdaptiveSizePolicy

-Xlog:gc+ergo*=level

使用levelofdebug表示大部分信息,或使用leveloftrace表示所有记录的信息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

请注意,在旧的日志记录中,仅当也启用时才 PrintReferenceGC有效。PrintGCDetails

PrintStringDeduplicationStatistics

-Xlog:gc+stringdedup*=debug

不适用

PrintTenuringDistribution

-Xlog:gc+age*=level

使用levelofdebug来获取最相关的信息,或者使用 ofleveltrace获取所有记录的信息PrintTenuringDistribution

UseGCLogFileRotation

不适用

记录了什么PrintTenuringDistribution

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

表 2-3 将运行时日志记录标志映射到 Xlog 配置

旧版运行时标志 Xlog配置 评论
TraceExceptions

-Xlog:exceptions=info

不适用

TraceClassLoading

-Xlog:class+load=level

用于level=info常规信息或level=debug附加信息。在统一日志记录语法中,-verbose:class等于-Xlog:class+load=info,class+unload=info

TraceClassLoadingPreorder

-Xlog:class+preorder=debug

不适用

TraceClassUnloading

-Xlog:class+unload=level

用于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

用于level=debug常规信息或level=trace附加信息。

TraceSafepointCleanupTime

-Xlog:safepoint+cleanup=info

不适用

TraceSafepoint

-Xlog:safepoint=debug

不适用

TraceMonitorInflation

-Xlog:monitorinflation=debug

不适用

TraceBiasedLocking

-Xlog:biasedlocking=level

用于level=info常规信息或level=trace附加信息。

TraceRedefineClasses

-Xlog:redefine+class*=level

使用level=infolevel=debug、 和level=trace来提供越来越多的信息。

-Xlog 使用示例

以下是-Xlog示例。

-Xlog

使用带有、和装饰的info级别来记录所有消息。这相当于使用: stdoutuptimelevelstags

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

gc记录使用infolevel to标记的消息stdout。该级别所有其他消息的默认配置warning均有效。

-Xlog:gc,safepoint

记录用gcsafepoint标签标记的消息,两者都使用info级别 to stdout,并带有默认装饰。带有两者标记的消息gcsafepoint不会被记录。

-Xlog:gc+ref=debug

记录用gcref标签标记的消息,使用debug级别 to 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使用infolevel 标记的消息,但关闭标记为 的消息的日志记录safepoint。带有两者标记的消息gcsafepoint不会被记录。

-Xlog:disable -Xlog:safepoint=trace:safepointtrace.txt

关闭所有日志记录,包括警告和错误,然后启用文件中标记有safepointusing level 的消息。默认配置不适用,因为命令行以. tracesafepointtrace.txt-Xlog:disable

复杂 -Xlog 用法示例

下面描述了使用该选项的几个复杂示例-Xlog

-Xlog:gc+class*=debug

记录使用至少级别标记的消息gc和使用级别 to 的class标记。该级别所有其他消息的默认配置仍然有效 debugstdoutwarning

-Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt

使用级别将至少标记有gc和标记的消息记录到文件中,但关闭所有标记有 的消息。标有、、 和 的消息不会被记录,因为设置为关闭。除包含 的消息外,该级别的所有其他消息的默认配置均有效。 metatracemetatrace.txtclassgcmetaclassclass*warningclass

-Xlog:gc+meta=trace

记录使用级别 to精确标记为gc和标签的消息。该级别所有其他消息的默认配置仍然有效。 metatracestdoutwarning

-Xlog:gc+class+heap*=debug,meta*=warning,threads*=off

使用level记录至少标记有gcclass和标记的消息,但仅记录标记为with level 的消息。除包含 的消息外,该级别的所有其他消息的默认配置均有效。 heaptracestdoutmetawarningthreads

验证 Java 虚拟机标志参数

您可以使用提供给所有 Java 虚拟机 (JVM) 命令行标志的值进行验证,如果输入值无效或超出范围,则会显示相应的错误消息。

无论它们是在命令行中、通过输入工具还是通过 API(例如,包中包含的类java.lang.management)按照人体工程学进行设置,提供给所有 Java 虚拟机 (JVM) 命令行标志的值都会经过验证。Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide中描述了人体工程学。

当所有标志在 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 将恢复使用常规页面。

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

Oracle Solaris 大页面支持

Oracle Solaris 9 及更高版本包含多页大小支持 (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千字节 = 1536):

    # echo 1536 > /proc/sys/vm/nr_hugepages

笔记:

  • /proc重新启动系统后,重置中包含的值,因此您可能需要在初始化脚本中设置它们(例如,rc.localsysctl.conf)。

  • 如果您配置(或调整)操作系统内核参数/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 之前,在以下情况下,非空目录会被报告为致命错误:

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

  • 对于,路径、类路径和模块路径 -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默认成为产品标志。不再需要在所有配置中 指定+UnlockDiagnosticVMOptionsfor 。SharedArchiveFile

类数据共享 (CDS)/AppCDS 不支持在类列表中归档数组类。当遇到类列表中的数组时,CDS dump time 会给出明确的错误消息:
Preload Warning: Cannot find array_name
尽管不允许在类列表中使用数组,但仍然可以在 CDS/AppCDS 转储时创建一些数组类。这些数组是在 Java 类加载器(和系统类加载器)执行 Java 代码期间创建的,PlatformClassLoader用于在转储时加载类。创建的数组与其余加载的类一起存档。

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

在 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
  • 要使用 VM 选项运行 CDS 存档--module-path,请使用以下命令行语法:

    $ java -XX:SharedArchiveFile=shared_archive_file \
        --module-path=path_to_modular_jar -m module_name

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

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

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

2mp转储时间与运行时间期间可以指定不同的值。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、 或,则会打印一条警告消息,指示 CDS 已禁用。--limit-modules例如,如果--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  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 中的存档类。

创建共享存档文件并使用它来运行应用程序

以下步骤创建一个共享存档文件,其中包含应用程序使用的所有类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

跨多个应用程序进程共享共享存档

您可以在多个应用程序进程之间共享同一个存档文件。这减少了内存使用量,因为存档被内存映射到进程的地址空间中。操作系统自动在这些进程之间共享只读页面。

以下步骤演示如何创建可由不同应用程序共享的公共存档。只有来自的类common.jar才会在(步骤 3)中存档common.jsahello.jar在此特定示例中,来自和 的类hi.jar不会被存档,因为它们在存档步骤(步骤 3)期间不在类路径中。

要包含hello.jar和中的类hi.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. 创建由所有将共享共享存档文件的应用程序使用的类的单个列表。

    Oracle Solaris、Linux 和 macOS:以下命令将文件hello.classlisthi.classlist到一个文件中common.classlist

    cat hello.classlist hi.classlist > common.classlist
    Windows:以下命令将文件hello.classlist和合并hi.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

    Hello使用的类路径参数是和应用程序共享的公共类路径前缀Hi

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

在 JDK 10 及更高版本中,存档类中的 CONSTANT_String 条目在转储时解析为驻留 String 对象,并且所有驻留 String 对象都被存档。然而,即使所有归档类中的所有 CONSTANT_String 文字都已解析,添加其他字符串可能仍然有益,这些字符串不是类文件中的字符串文字,但可能会在运行时被应用程序使用。

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

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

jcmd pid VM.symboltable -verbose
笔记:

此输出的第一行(进程 ID)和第二行(“@VERSION ...”)jcmd应从配置文件中排除。

配置文件示例

以下是配置文件的示例:

VERSION: 1.0
@SECTION: Symbol
10 -1: linkMethod
在配置文件示例中,@SECTION: Symbol条目使用以下格式:
length refcount: symbol
refcount共享符号的 始终为-1

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

性能调优示例

您可以使用 Java 高级运行时选项来优化应用程序的性能。

调整以获得更高的吞吐量

使用以下命令和高级运行时选项可为您的应用程序实现更高的吞吐量性能:

java -server -XX:+UseParallelGC -XX:+UseLargePages -Xmn10g -Xms26g -Xmx26g
调整以缩短响应时间

使用以下命令和高级运行时选项可以缩短应用程序的响应时间:

java -XX:+UseG1GC -Xms26g Xmx26g -XX:MaxGCPauseMillis=500 -XX:+PrintGCTimeStamp
保持 Java 堆较小并减少嵌入式应用程序的动态占用空间

使用以下高级运行时选项可以保持 Java 堆较小并减少嵌入式应用程序的动态占用空间:

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

笔记:

这两个选项的默认值分别为 70% 和 40%。由于使用这些小设置时可能会牺牲性能,因此您应该通过尽可能减少这些设置来优化小占用空间,而不会导致不可接受的性能下降。

退出状态

当使用错误参数、严重错误或 JVM 引发的异常调用启动器时,启动器通常会返回以下退出值。但是,Java 应用程序可以选择使用 API 调用返回任何值System.exit(exitValue)。这些值为:

  • 0:成功完成

  • >0: 发生错误

你可能感兴趣的:(java)