Java命令参数大全,Java平台标准版工具参考(unix)

参考文档

  1. Java Platform, Standard Edition Tools Reference (JDK8官方)

目录

Java

启动 Java 应用程序。

概要

java [options] classname [args]

java [options] -jar filename [args]

options
以空格分隔的命令行选项。 请参阅选项

classname
要启动的类的名称。

filename
要调用的 Java 归档 (JAR) 文件的名称。 仅与 -jar 选项一起使用。

args
传递给 main() 方法的参数由空格分隔。

描述

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

public static void main(String[] args)

java 命令可用于通过加载具有 main() 方法或扩展 javafx.application.Application 的类来启动 JavaFX 应用程序。 在后一种情况下,启动器构造 Application 类的实例,调用其 init() 方法,然后调用 start(javafx.stage.Stage) 方法。

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

JRE 在三组位置中搜索启动类(以及应用程序使用的其他类):引导程序类路径、已安装的扩展和用户的类路径。

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

选项

java 命令支持范围广泛的选项,可分为以下几类:

Java 虚拟机 (JVM) 的所有实现都保证支持标准选项。 它们用于常见操作,例如检查 JRE 的版本、设置类路径、启用详细输出等。

非标准选项是特定于 Java HotSpot 虚拟机的通用选项,因此不能保证所有 JVM 实现都支持它们,并且可能会发生变化。 这些选项以 -X 开头。

不建议随意使用高级选项。 这些是用于调整 Java HotSpot 虚拟机操作的特定区域的开发人员选项,这些区域通常具有特定的系统要求并且可能需要对系统配置参数的特权访问。 它们也不保证所有 JVM 实现都支持,并且可能会发生变化。 高级选项以 -XX 开头。

为了跟踪最新版本中弃用或删除的选项,文档末尾有一个名为“弃用和删除的选项”的部分。

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

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

标准选项

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

  • -agentlib:libname[=options]
    加载指定的本机代理库。 在库名称之后,可以使用以逗号分隔的特定于库的选项列表。

    如果指定选项 -agentlib:foo,则 JVM 会尝试在 LD_LIBRARY_PATH 系统变量指定的位置加载名为 libfoo.so 的库(在 OS X 上,该变量为 DYLD_LIBRARY_PATH)。

    以下示例展示了如何加载堆分析工具 (HPROF) 库并每 20 毫秒获取一次示例 CPU 信息,堆栈深度为 3:
    -agentlib:hprof=cpu=samples,interval=20,depth=3

    以下示例展示了如何加载 Java 调试线协议 (JDWP) 库并侦听端口 8000 上的套接字连接,从而在加载主类之前暂停 JVM:
    -agentlib:jdwp=transport=dt_socket,server=y,address=8000

    有关本地代理库的更多信息,请参阅以下内容:

  • -agentpath:pathname[=options]
    加载由绝对路径名指定的本机代理库。 此选项等效于“-agentlib”,但使用库的完整路径和文件名。

  • -client
    选择 Java HotSpot 客户端 VM。 64 位版本的 Java SE 开发工具包 (JDK) 目前忽略此选项,而是使用服务器 JVM。

    对于默认的 JVM 选择,请参阅 [http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html](http://docs.oracle. com/javase/8/docs/technotes/guides/vm/server-class.html)

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

  • -d32
    在 32 位环境中运行应用程序。 如果没有安装或者不支持32位环境,那么就会报错。 默认情况下,应用程序在 32 位环境中运行,除非使用 64 位系统。

  • -d64
    在 64 位环境中运行应用程序。 如果没有安装或者不支持64位环境,那么就会报错。 默认情况下,应用程序在 32 位环境中运行,除非使用 64 位系统。

    目前只有 Java HotSpot Server VM 支持 64 位操作,并且使用 -d64 隐含了 -server 选项。 使用 -d64 会忽略 -client 选项。 这可能会在未来的版本中发生变化。

  • -disableassertions[:[packagename]...|:classname]

  • -da[:[packagename]...|:classname]
    禁用断言。默认情况下,禁用断言在所有的包和类。

    不带参数,“disableassertions”(- da)禁用断言所有的包和类。与_packagename_论点结束”…的,开关禁用断言指定包和任何子包。如果参数是简单的……”,那么开关禁用断言在不知名的包在当前工作目录中。_classname_论点,开关禁用断言指定的类。

    -disableassertions(-da) 选项适用于所有类加载器和系统类(没有类装入器)。有一个例外:如果没有参数提供的选项,那么它并不适用于系统类。这使它容易禁用断言除了系统类的所有类。-disablesystemassertions 选项使您可以禁用断言系统类。

    在特定的包或类显式地启用断言,使用-enableassertions(-ea)选项。这两种选择都可以同时使用。例如,运行 MyClass 应用程序时启用断言在包 com.wombat.fruitbat (和任何子包), 但在课堂上禁用 com.wombat.fruitbat.Brickbat, 使用以下命令:
    java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyClass

  • -disablesystemassertions

  • -dsa
    在所有系统类中禁用断言。

  • -enableassertions[:[packagename]...|:classname]

  • -ea[:[packagename]...|:classname]
    启用断言。 默认情况下,断言在所有包和类中都是禁用的。

    没有参数,-enableassertions (-ea) 在所有包和类中启用断言。 使用以 ... 结尾的 packagename 参数,开关启用指定包和任何子包中的断言。 如果参数只是“...”,则开关会在当前工作目录的未命名包中启用断言。 使用 classname 参数,开关启用指定类中的断言。

    -enableassertions (-ea) 选项适用于所有类加载器和系统类(没有类加载器)。 此规则有一个例外:如果提供的选项没有参数,则它不适用于系统类。 这使得在除系统类之外的所有类中启用断言变得容易。-enablesystemassertions 选项提供了一个单独的开关来启用所有系统类中的断言。

    要明确禁用特定包或类中的断言,请使用 -disableassertions (-da) 选项。 如果单个命令包含这些开关的多个实例,则在加载任何类之前按顺序处理它们。 例如,要运行仅在包 com.wombat.fruitbat(和任何子包)中启用但在类 com.wombat.fruitbat.Brickbat 中禁用断言的 MyClass 应用程序,请使用以下命令:
    java -ea:com.wombat.fruitbat...-da:com.wombat.fruitbat.Brickbat MyClass

  • -enablesystemassertions

  • -esa
    在所有系统类中启用断言。

  • -help

  • -?
    在不实际运行 JVM 的情况下显示 java 命令的使用信息。

  • -jar filename
    执行封装在 JAR 文件中的程序。 filename 参数是带有清单的 JAR 文件的名称,清单中包含一行格式为Main-Class:classname 的行,该行定义了具有服务的public static void main(String[] args) 方法的类 作为您的应用程序的起点。

    当您使用 -jar 选项时,指定的 JAR 文件是所有用户类的源,其他类路径设置将被忽略。

    有关 JAR 文件的更多信息,请参阅以下资源:

  • -javaagent:jarpath[=options]
    加载指定的 Java 编程语言代理。 有关检测 Java 应用程序的更多信息,请参阅 Java API 文档中的 java.lang.instrument 包描述,网址为 http://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html

  • -jre-restrict-search
    在版本搜索中包括用户私有的 JRE。

  • -no-jre-restrict-search
    从版本搜索中排除用户私有的 JRE。

  • -server
    选择 Java HotSpot 服务器 VM。 64 位版本的 JDK 仅支持服务器 VM,因此在这种情况下该选项是隐式的。

    对于默认的 JVM 选择,请参阅服务器类机器检测,网址为 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html

  • -showversion
    显示版本信息并继续执行应用程序。 此选项等同于 -version 选项,只是后者指示 JVM 在显示版本信息后退出。

  • -splash:imgname
    使用 imgname 指定的图像显示启动画面。 例如,要在启动应用程序时显示 images 目录中的 splash.gif 文件,请使用以下选项:
    -splash:images/splash.gif

  • -verbose:class
    显示有关每个已加载类的信息。

  • -verbose:gc
    显示有关每个垃圾回收 (GC) 事件的信息。

  • -verbose:jni
    显示有关使用本机方法和其他 Java 本机接口 (JNI) 活动的信息。

  • -version
    显示版本信息然后退出。 此选项等同于 -showversion 选项,只是后者不指示 JVM 在显示版本信息后退出。

  • -version:release
    指定要用于运行应用程序的发行版本。 如果调用的 java 命令版本不符合此规范,并且在系统上找到了适当的实现,则将使用适当的实现。

    release 参数指定确切的版本字符串,或由空格分隔的版本字符串和范围列表。 version string 是开发人员对版本号的指定,格式如下:1.x.0_u(其中 x 是主版本号,u 是更新版本号)。 version range 由版本字符串后跟加号 (+) 组成,以指定此版本或更高版本,或者由版本字符串的一部分后跟星号 (*) 组成,以指定带有 匹配前缀。 版本字符串和范围可以使用空格进行逻辑 OR 组合,或使用符号 (&) 进行两个版本字符串/范围的逻辑 AND 组合。 例如,如果运行类或 JAR 文件需要 JRE 6u13 (1.6.0_13) 或从 6u10 (1.6.0_10) 开始的任何 JRE 6,请指定以下内容:
    -version:"1.6.0_13 1.6* & 1.6.0_10+"

    仅当 release 参数中有空格时才需要引号。

    对于 JAR 文件,首选是在 JAR 文件清单中而不是在命令行中指定版本要求。

非标准选项

这些选项是特定于 Java HotSpot 虚拟机的通用选项。

  • -X
    显示所有可用的 -X 选项的帮助。

  • -Xbatch
    禁用后台编译。 默认情况下,JVM 将方法编译为后台任务,以解释器模式运行方法,直到后台编译完成。 -Xbatch 标志禁用后台编译,以便所有方法的编译作为前台任务进行,直到完成。

    此选项等效于“-XX:-BackgroundCompilation”。

  • -Xbootclasspath:path
    指定以冒号 (😃 分隔的目录、JAR 文件和 ZIP 归档的列表,以搜索引导类文件。 这些用于代替 JDK 中包含的引导类文件。

    不要部署使用此选项覆盖 rt.jar 中的类的应用程序,因为这违反了 JRE 二进制代码许可。

  • -Xbootclasspath/a:path
    指定以冒号 (😃 分隔的目录、JAR 文件和 ZIP 归档的列表,以附加到默认引导程序类路径的末尾。

    不要部署使用此选项覆盖 rt.jar 中的类的应用程序,因为这违反了 JRE 二进制代码许可。

  • -Xbootclasspath/p:path
    指定以冒号 (😃 分隔的目录、JAR 文件和 ZIP 归档的列表,以添加到默认引导程序类路径的前面。

    不要部署使用此选项覆盖 rt.jar 中的类的应用程序,因为这违反了 JRE 二进制代码许可。

  • -Xcheck:jni
    对 Java 本机接口 (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:filename
    设置详细 GC 事件信息应重定向到的文件以进行日志记录。 写入此文件的信息类似于 -verbose:gc 的输出,其中包含自每个记录事件之前的第一个 GC 事件以来经过的时间。 -Xloggc 选项会覆盖 -verbose:gc 如果两者都使用相同的 java 命令。

    示例:
    -Xloggc:garbage-collection.log

  • -Xmaxjitcodesize=size
    指定 JIT 编译代码的最大代码缓存大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认最大代码缓存大小为 240 MB; 如果您使用选项“-XX:-TieredCompilation”禁用分层编译,则默认大小为 48 MB:

  • -Xmaxjitcodesize=240m
    这个选项等同于“-XX:ReservedCodeCacheSize”。

  • -Xmixed
    解释器执行所有字节码,热方法除外,这些方法被编译为本机代码。

  • -Xmn_size_
    为新生代(nursery)设置堆的初始大小和最大大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。

    堆的年轻代区域用于新对象。 GC 在这个区域比在其他区域更频繁地执行。 如果新生代的大小太小,那么会执行很多小的垃圾收集。 如果大小太大,则只会执行完整的垃圾收集,这可能需要很长时间才能完成。 Oracle 建议您将新生代的大小保持在整个堆大小的一半到四分之一之间。

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

    -Xmn256m
    -Xmn262144k
    -Xmn268435456
    

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

  • -Xms_size_
    设置堆的最小和初始大小(以字节为单位)。 此值必须是 1024 的倍数且大于 1 MB。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。

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

    -Xms6291456
    -Xms6144k
    -Xms6m
    

    如果你不设置这个选项,那么初始大小将被设置为分配给老年代和年轻代的大小之和。 可以使用 -Xmn 选项或 -XX:NewSize 选项设置新生代堆的初始大小。

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

  • -Xmx_size_
    以字节为单位指定内存分配池的最大大小(以字节为单位)。 此值必须是 1024 的倍数且大于 2 MB。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认值是在运行时根据系统配置选择的。 对于服务器部署,-Xms-Xmx 通常设置为相同的值。 请参阅 《Java SE HotSpot 虚拟机垃圾收集调优指南》 中的“人体工程学”部分 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html .

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

    -Xmx83886080
    -Xmx81920k
    -Xmx80m
    

    -Xmx 选项等同于 -XX:MaxHeapSize

  • -Xnoclassgc
    禁用类的垃圾回收 (GC)。 这可以节省一些 GC 时间,从而缩短应用程序运行期间的中断。

    当您在启动时指定 -Xnoclassgc 时,应用程序中的类对象将在 GC 期间保持不变,并且始终被视为活动的。 这会导致更多的内存被永久占用,如果不小心使用,将会抛出内存不足异常。

  • -Xprof
    分析正在运行的程序并将分析数据发送到标准输出。 此选项作为实用程序提供,在程序开发中很有用,并不打算在生产系统中使用。

  • -Xrs
    减少 JVM 对操作系统信号的使用。

    关闭挂钩通过在关闭时运行用户清理代码(例如关闭数据库连接)来实现 Java 应用程序的有序关闭,即使 JVM 突然终止也是如此。

    JVM 捕获信号以实现意外终止的关闭挂钩。 JVM 使用SIGHUPSIGINTSIGTERM 启动关闭挂钩的运行。

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

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

    指定 -Xrs 有两个后果:

    • SIGQUIT 线程转储不可用。
    • 用户代码负责造成关闭挂钩运行,例如,在 JVM 终止时调用 System.exit()
  • -Xshare:mode
    设置类数据共享 (CDS) 模式。 此选项的可能 mode 参数包括以下内容:
    auto
    尽可能使用 CDS。 这是 Java HotSpot 32 位客户端 VM 的默认值。
    on
    需要使用 CDS。 如果无法使用类数据共享,则打印错误消息并退出。
    off
    不要使用 CDS。 这是 Java HotSpot 32 位服务器 VM、Java HotSpot 64 位客户端 VM 和 Java HotSpot 64 位服务器 VM 的默认值。
    dump
    手动生成 CDS 存档。 如 “设置类路径” 中所述指定应用程序类路径。 您应该为每个新的 JDK 版本重新生成 CDS 存档。

  • -XshowSettings:category
    显示设置并继续。 此选项可能的_category_参数包括以下内容:
    all
    显示所有类别的设置。 这是默认值。
    locale
    显示与语言环境相关的设置。
    properties
    显示与系统属性相关的设置。
    vm
    显示 JVM 的设置。

  • -Xss_size_
    设置线程堆栈大小(以字节为单位)。 附加字母“k”或“K”表示 KB,“m”或“M”表示 MB,“g”或“G”表示 GB。 默认值取决于平台:

    • Linux/ARM (32-bit): 320 KB
    • Linux/i386 (32-bit): 320 KB
    • Linux/x64 (64-bit): 1024 KB
    • macOS (64-bit): 1024 KB
    • Oracle Solaris/i386 (32-bit): 320 KB
    • Oracle Solaris/x64 (64-bit): 1024 KB
    • Windows: 默认值取决于虚拟内存
      以下示例以不同的单位将线程堆栈大小设置为 1024 KB:
    -Xss1m
    -Xss1024k
    -Xss1048576
    

    此选项类似于-XX:ThreadStackSize

  • -Xusealtsigs
    对于 JVM 内部信号,使用替代信号代替 SIGUSR1SIGUSR2。 此选项等同于-XX:+UseAltSigs

  • -Xverify:mode
    设置字节码验证器的模式。 字节码验证确保类文件的格式正确并满足第 4.10 节中列出的约束,[class 文件的验证](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4 .html#jvms-4.10)在 Java 虚拟机规范 中。

    不要关闭验证,因为这会降低 Java 提供的保护,并可能由于格式错误的类文件而导致问题。

    此选项的可能 mode 参数包括以下内容:
    remote
    验证引导类加载器未加载的所有字节码。 如果您不指定 -Xverify 选项,这是默认行为。
    all
    启用对所有字节码的验证。
    none
    禁用所有字节码的验证。 不支持使用 -Xverify:none

高级运行时选项

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

  • -XX:+CheckEndorsedAndExtDirs
    如果 Java 应用程序使用认可标准覆盖机制或扩展机制,则启用该选项以阻止 java 命令运行 Java 应用程序。 此选项通过检查以下内容来检查应用程序是否正在使用这些机制之一:

    • 设置了 java.ext.dirsjava.endorsed.dirs 系统属性。
    • lib/endorsed 目录存在且不为空。
    • lib/ext 目录包含除 JDK 之外的任何 JAR 文件。
    • 系统范围的特定于平台的扩展目录包含任何 JAR 文件。
  • -XX:+DisableAttachMechanism
    启用禁用允许工具附加到 JVM 的机制的选项。 默认情况下,此选项处于禁用状态,这意味着附加机制已启用,您可以使用 jcmdjstackjmapjinfo 等工具。

  • -XX:ErrorFile=filename
    指定发生不可恢复错误时写入错误数据的路径和文件名。 默认情况下,此文件在当前工作目录中创建并命名为hs_err_pidpid.log,其中 pid 是导致错误的进程的标识符。 以下示例显示了如何设置默认日志文件(请注意,进程的标识符指定为 %p):
    -XX:ErrorFile=./hs_err_pid%p.log
    以下示例显示了如何将错误日志设置为/var/log/java/java_error.log
    -XX:ErrorFile=/var/log/java/java_error.log
    如果无法在指定目录中创建文件(由于空间不足、权限问题或其他问题),则会在操作系统的临时目录中创建文件。 临时目录是/tmp

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

  • -XX:+FlightRecorder
    允许在应用程序运行时使用 Java 飞行记录器 (JFR)。 这是一项与 -XX:+UnlockCommercialFeatures 选项结合使用的商业功能,如下所示:
    java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

    如果未提供此选项,Java Flight Recorder 仍然可以通过提供适当的 jcmd 诊断命令在正在运行的 JVM 中启用。

  • -XX:-FlightRecorder
    在应用程序运行时禁用 Java 飞行记录器 (JFR)。 这是一项与 -XX:+UnlockCommercialFeatures 选项结合使用的商业功能,如下所示:
    java -XX:+UnlockCommercialFeatures -XX:-FlightRecorder

    如果提供此选项,则无法在正在运行的 JVM 中启用 Java Flight Recorder。

  • -XX:FlightRecorderOptions=parameter=value
    设置控制 JFR 行为的参数。 这是一项与 -XX:+UnlockCommercialFeatures 选项结合使用的商业功能。 此选项只能在启用 JFR 时使用(即指定 -XX:+FlightRecorder 选项)。

    以下列表包含所有可用的 JFR 参数:
    defaultrecording={true|false}
    指定是否应为 Java 应用程序启动_默认_连续记录。 默认情况下,此参数设置为“false”。 要自动开始默认录制,请将参数设置为 true
    disk={true|false}
    指定是否将临时数据写入磁盘存储库。 默认情况下,此参数设置为“false”。 要启用它,请将参数设置为“true”。
    dumponexit={true|false}
    指定当 JVM 以受控方式终止时是否应生成 JFR 数据的转储文件。 默认情况下,此参数设置为false(不生成退出时的转储文件)。
    要启用它,请将参数设置为“true”,并设置“defaultrecording=true”。 转储文件被写入由 dumponexitpath 参数定义的位置。
    dumponexitpath=path
    如果您设置了 dumponexit=true 参数,则指定 JVM 以受控方式退出时创建的带有 JFR 数据的转储文件的路径和名称。 仅当您还设置了defaultrecording=true 时设置路径才有意义。
    如果指定的路径是一个目录,JVM 会分配一个显示创建日期和时间的文件名。 如果指定的路径包含文件名并且该文件已经存在,则 JVM 通过将日期和时间戳附加到指定的文件名来创建一个新文件。
    globalbuffersize=size
    指定用于数据保留的主内存总量(以字节为单位)。 附加kK,以 KB 为单位指定大小,附加mM,以 MB 为单位指定大小,附加gG,以指定 GB 为单位的大小。 默认情况下,大小设置为 462848 字节。
    loglevel={quiet|error|warning|info|debug|trace}
    指定 JFR 写入日志文件的数据量。 默认情况下,它设置为 info
    maxage=time
    指定为默认记录保留的磁盘数据的最长期限。 附加 s 以指定以秒为单位的时间,m 代表分钟,h 代表小时,或附加 d 代表天(例如,指定 30s 表示 30 秒)。
    默认情况下,最长期限设置为 15 分钟 (15m)。 此参数仅在您设置 disk=true 参数时有效。
    maxchunksize=size
    指定记录中数据块的最大大小(以字节为单位)。 附加kK,以 KB 为单位指定大小,附加mM,以 MB 为单位指定大小,附加gG,以指定 GB 为单位的大小。 默认情况下,数据块的最大大小设置为 12 MB。
    maxsize=size
    指定为默认记录保留的磁盘数据的最大大小(以字节为单位)。 附加kK,以 KB 为单位指定大小,附加mM,以 MB 为单位指定大小,附加gG,以指定 GB 为单位的大小。 默认情况下,磁盘数据的最大大小没有限制,该参数设置为0。
    此参数仅在您设置 disk=true 参数时有效。
    repository=path
    指定用于临时磁盘存储的存储库(目录)。 默认情况下,使用系统的临时目录。
    samplethreads={true|false}
    指定是否启用线程采样。 仅当采样事件与此参数一起启用时,才会发生线程采样。 默认情况下,启用此参数。
    settings=path
    指定事件设置文件(JFC 类型)的路径和名称。 默认情况下,使用位于JAVA_HOME/jre/lib/jfr 中的default.jfc 文件。
    stackdepth=depth
    JFR 堆栈跟踪的堆栈深度。 默认情况下,深度设置为 64 次方法调用。 最大值为 2048,最小值为 1。
    threadbuffersize=size
    指定每线程本地缓冲区大小(以字节为单位)。 附加kK,以 KB 为单位指定大小,附加mM,以 MB 为单位指定大小,附加gG,以指定 GB 为单位的大小。 此参数的较高值允许收集更多数据而无需争用将其刷新到全局存储。 它可以在线程丰富的环境中增加应用程序占用空间。 默认情况下,本地缓冲区大小设置为 5 KB。
    您可以通过用逗号分隔多个参数来指定它们的值。 例如,要指示 JFR 将连续记录写入磁盘,并将数据块的最大大小设置为 10 MB,请指定以下内容:
    -XX:FlightRecorderOptions=defaultrecording=true,disk=true,maxchunksize=10M

  • -XX:LargePageSizeInBytes=size
    在 Solaris 上,设置用于 Java 堆的大页面的最大大小(以字节为单位)。 size 参数必须是 2 的幂(2、4、8、16,...)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认情况下,大小设置为 0,这意味着 JVM 会自动选择大页面的大小。

    以下示例说明如何将大页面大小设置为 4 兆字节 (MB):
    -XX:LargePageSizeInBytes=4m

  • -XX:MaxDirectMemorySize=size
    设置新 I/O(java.nio 包)直接缓冲区分配的最大总大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认情况下,大小设置为 0,这意味着 JVM 自动选择 NIO 直接缓冲区分配的大小。

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

    -XX:MaxDirectMemorySize=1m
    -XX:MaxDirectMemorySize=1024k
    -XX:MaxDirectMemorySize=1048576
    
  • -XX:NativeMemoryTracking=mode
    指定跟踪 JVM 本机内存使用情况的模式。 此选项的可能 mode 参数包括以下内容:
    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
    将自定义命令或一系列以分号分隔的命令设置为在发生不可恢复的错误时运行。 如果字符串包含空格,则必须用引号括起来。

    以下示例显示了如何使用 -XX:OnError 选项运行 gcore 命令来创建核心映像,并在出现不可恢复的错误时启动调试器附加到进程(%p 指定当前进程):
    -XX:OnError="gcore %p;dbx - %p"

  • -XX:OnOutOfMemoryError=string
    将自定义命令或一系列以分号分隔的命令设置为在首次抛出 OutOfMemoryError 异常时运行。 如果字符串包含空格,则必须用引号括起来。 有关命令字符串的示例,请参阅“-XX:OnError”选项的说明。

  • -XX:+PerfDataSaveToFile
    如果启用,则在 Java 应用程序退出时保存 jstat(1) 二进制数据。 此二进制数据保存在名为hsperfdata_<pid> 的文件中,其中<pid> 是您运行的 Java 应用程序的进程标识符。 使用 jstat 显示此文件中包含的性能数据,如下所示:

    jstat -class file:///<path>/hsperfdata_<pid>
    jstat -gc file:///<path>/hsperfdata_<pid>
    
  • -XX:-PreferContainerQuotaForCPUCount
    如果为真,则根据其 CPU CFS(完全公平调度程序)配额(如果设置)的值计算容器 CPU 可用性。 如果为 false,则使用 CPU 份额值代替,前提是它小于 CPU 配额值。

    如果您没有使用 -XX:ActiveProcessorCount 选项指定它,VM 将使用容器 CPU 可用性值来计算可用处理器的数量。

    注意:CPU 计数永远不会超过进程可用的活动处理器数。 活动处理器可能已通过禁用它们或通过为容器选择一个 cpuset(CPU 列表;请参阅 PrintContainerInfo 选项)而受到限制。

  • -XX:+PrintCommandLineFlags
    启用打印出现在命令行上的符合人体工程学的 JVM 标志。 了解 JVM 设置的符合人体工程学的值可能很有用,例如堆空间大小和选定的垃圾收集器。 默认情况下,此选项被禁用并且不打印标志。

  • -XX:+PrintContainerInfo
    打印有关容器的以下信息:

    • cpuset.cpus: 如果您有多个 CPU 或内核,容器可以使用的 CPU 或内核的逗号分隔列表或连字符分隔范围。 例如,值0-3表示容器可以使用第一、第二、第三和第四个CPU。
    • cpuset.mems: 逗号分隔的列表或连字符分隔的内存节点 (MEM) 范围,允许在其中执行; 应用程序的运行; 仅对非统一内存访问 (NUMA) 系统有效。
    • CPU Shares: 进程可用的 CPU 份额数量。
    • CPU Quota: 保证每个周期进程运行的毫秒数。
    • CPU Period: CPU 完全公平调度程序 (CFS) 周期,以毫秒为单位。
    • OSContainer::active_processor_count: 供 VM 使用的活动处理器数。
    • Memory Limit: 容器可以使用的最大内存量,以字节为单位。
    • Memory Soft Limit: 容器应该使用的最大内存量,以字节为单位; 此限制小于 Memory Limit,但由于这是一个软限制,容器可能会超过它。
    • Memory Usage: 此进程使用的内存量,以字节为单位。
    • Maximum Memory Usage: 此进程使用的最大内存量,以字节为单位。
  • -XX:+PrintNMTStatistics
    当启用本机内存跟踪时,允许在 JVM 退出时打印收集的本机内存跟踪数据(请参阅-XX:NativeMemoryTracking)。 默认情况下,此选项被禁用并且不打印本机内存跟踪数据。

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

  • -XX:+ResourceManagement
    允许在应用程序运行时使用资源管理。

    这是一项商业功能,需要您还指定 -XX:+UnlockCommercialFeatures 选项,如下所示:
    java -XX:+UnlockCommercialFeatures -XX:+ResourceManagement

  • -XX:ResourceManagementSampleInterval=value (milliseconds)
    设置控制资源管理测量的采样间隔的参数,以毫秒为单位。

    此选项只能在启用资源管理时使用(即指定 -XX:+ResourceManagement 选项)。

  • -XX:SharedArchiveFile=path
    指定类数据共享 (CDS) 存档文件的路径和名称

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

    java/lang/Object
    hello/Main
    

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

  • -XX:+ShowMessageBoxOnError
    当 JVM 遇到不可恢复的错误时启用对话框的显示。 这可以防止 JVM 退出并使进程保持活动状态,以便您可以将调试器附加到它以调查错误原因。 默认情况下,此选项被禁用。

  • -XX:StartFlightRecording=parameter=value
    为 Java 应用程序启动 JFR 记录。 这是一项与 -XX:+UnlockCommercialFeatures 选项结合使用的商业功能。 此选项等效于在运行时启动记录的JFR.start 诊断命令。 开始 JFR 录制时,您可以设置以下参数:
    compress={true|false}
    指定是否使用 gzip 文件压缩实用程序压缩磁盘上的 JFR 记录日志文件(JFR 类型)。 仅当指定了 filename 参数时,此参数才有效。 默认情况下,它设置为false(录音未压缩)。 要启用压缩,请将参数设置为“true”。
    defaultrecording={true|false}
    指定录制是连续的后台录制还是在有限的时间内运行。 默认情况下,此参数设置为false(录制运行时间有限)。 要使记录连续运行,请将参数设置为 true
    delay=time
    指定 Java 应用程序启动时间和记录开始之间的延迟。 附加 s 以指定以秒为单位的时间,m 代表分钟,h 代表小时,或附加 d 代表天(例如,指定 10m 表示 10 分钟)。 默认情况下没有延迟,此参数设置为 0。
    dumponexit={true|false}
    指定当 JVM 以受控方式终止时是否应生成 JFR 数据的转储文件。 默认情况下,此参数设置为false(不生成退出时的转储文件)。
    要启用它,请将参数设置为“true”。 转储文件写入由 filename 参数定义的位置。
    例子:
    -XX:StartFlightRecording=name=test,filename=D:\test.jfr,dumponexit=true
    duration=time
    指定录制的持续时间。 附加 s 以指定以秒为单位的时间,m 代表分钟,h 代表小时,或 d 代表天数(例如,指定 5h 表示 5 小时)。 默认不限时长,该参数设置为0。
    filename=path
    指定 JFR 记录日志文件的路径和名称。
    name=identifier
    指定 JFR 记录的标识符。 默认情况下,它设置为Recording x
    maxage=time
    指定为默认记录保留的磁盘数据的最长期限。 附加 s 以指定以秒为单位的时间,m 代表分钟,h 代表小时,或附加 d 代表天(例如,指定 30s 表示 30 秒)。 默认情况下,最长期限设置为 15 分钟 (15m)。
    maxsize=size
    指定为默认记录保留的磁盘数据的最大大小(以字节为单位)。 附加kK,以 KB 为单位指定大小,附加mM,以 MB 为单位指定大小,附加gG,以指定 GB 为单位的大小。 默认情况下,磁盘数据的最大大小没有限制,该参数设置为0。
    settings=path
    指定事件设置文件(JFC 类型)的路径和名称。 默认情况下,使用位于JAVA_HOME/jre/lib/jfr 中的default.jfc 文件。
    您可以通过用逗号分隔多个参数来指定它们的值。 例如,要将记录保存到当前工作目录下的 test.jfr,并指示 JFR 压缩日志文件,指定以下内容:
    -XX:StartFlightRecording=filename=test.jfr,compress=true

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

    • Linux/ARM (32-bit): 320 KB
    • Linux/i386 (32-bit): 320 KB
    • Linux/x64 (64-bit): 1024 KB
    • macOS (64-bit): 1024 KB
    • Oracle Solaris/i386 (32-bit): 320 KB
    • Oracle Solaris/x64 (64-bit): 1024 KB
      以下示例显示如何将线程堆栈大小设置为不同单位的 1 兆字节:
    -XX:ThreadStackSize=1k
    -XX:ThreadStackSize=1024
    

    此选项类似于 -Xss

  • -XX:+TraceClassLoading
    启用类加载时的跟踪。 默认情况下,禁用此选项并且不跟踪类。

  • -XX:+TraceClassLoadingPreorder
    启用按引用顺序跟踪所有加载的类。 默认情况下,禁用此选项并且不跟踪类。

  • -XX:+TraceClassResolution
    启用对常量池解析的跟踪。 默认情况下,此选项被禁用并且不跟踪常量池解析。

  • -XX:+TraceClassUnloading
    启用类卸载时的跟踪。 默认情况下,禁用此选项并且不跟踪类。

  • -XX:+TraceLoaderConstraints
    启用加载程序约束记录的跟踪。 默认情况下,此选项被禁用并且不跟踪加载程序约束记录。

  • -XX:+UnlockCommercialFeatures
    允许使用商业功能。 商业功能包含在 Oracle Java SE Advanced 或 Oracle Java SE Suite 软件包中,如 Java SE 产品 页面所定义http://www.oracle.com/technetwork/java/javase/terms/products/index.html

    默认情况下,此选项被禁用,JVM 运行时没有商业功能。 一旦为 JVM 进程启用了它们,就不可能禁用它们对该进程的使用。

    如果未提供此选项,仍然可以使用适当的 jcmd 诊断命令在运行的 JVM 中解锁商业功能。

  • -XX:+UseAltSigs
    为 JVM 内部信号启用替代信号而不是 SIGUSR1SIGUSR2。 默认情况下,此选项被禁用并且不使用替代信号。 此选项等效于 -Xusealtsigs

  • -XX:+UseAppCDS
    启用应用程序类数据共享 (AppCDS)。 要使用 AppCDS,您还必须在 CDS 转储时间(请参阅选项“-Xshare:dump”)和应用程序运行期间为选项“-XX:SharedClassListFile”和“-XX:SharedArchiveFile”指定值。

    这是一项商业功能,需要您还指定“-XX:+UnlockCommercialFeatures”选项。 这也是一项实验性功能; 它可能会在未来的版本中改变。

    参见 "Application Class Data Sharing".

  • -XX:-UseBiasedLocking
    禁止使用偏向锁定。 启用此标志后,一些具有大量无竞争同步的应用程序可能会获得显着的加速,而具有某些锁定模式的应用程序可能会变慢。 有关偏向锁定技术的更多信息,请参阅 Java 调优白皮书中的示例,网址为 http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5

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

  • -XX:-UseCompressedOops
    禁用压缩指针的使用。 默认情况下,启用此选项,并在 Java 堆大小小于 32 GB 时使用压缩指针。 启用此选项后,对象引用表示为 32 位偏移量而不是 64 位指针,这通常会在运行 Java 堆大小小于 32 GB 的应用程序时提高性能。 此选项仅适用于 64 位 JVM。

    当 Java 堆大小大于 32GB 时,也可以使用压缩指针。 请参阅“-XX:ObjectAlignmentInBytes”选项。

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

  • -XX:+UseHugeTLBFS
    Linux 的此选项等同于指定“-XX:+UseLargePages”。 默认情况下禁用此选项。 当内存被保留时,这个选项预先分配所有大页面; 因此,JVM 无法动态地增大或缩小大页面内存区域; 如果您想要此行为,请参阅-XX:UseTransparentHugePages

    有关详细信息,请参阅 "Large Pages".

  • -XX:+UseLargePages
    启用大页面内存的使用。 默认情况下,禁用此选项并且不使用大页面内存。

    有关详细信息,请参阅 "Large Pages".

  • -XX:+UseMembar
    允许在线程状态转换时发布成员。 默认情况下,此选项在除 ARM 服务器之外的所有平台上都处于禁用状态,在该平台上它已启用。 (建议您不要在 ARM 服务器上禁用此选项。)

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

  • -XX:+UseTransparentHugePages
    在 Linux 上,允许使用可以动态增长或收缩的大页面。 默认情况下禁用此选项。 当操作系统移动其他页面以创建大页面时,您可能会遇到透明大页面的性能问题; 此选项可用于实验。

    有关详细信息,请参阅 "Large Pages".

  • -XX:+AllowUserSignalHandlers
    允许应用程序安装信号处理程序。 默认情况下,此选项被禁用,并且不允许应用程序安装信号处理程序。

高级 JIT 编译器选项

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

  • -XX:+AggressiveOpts
    启用积极的性能优化功能,这些功能有望在即将发布的版本中成为默认功能。 默认情况下,此选项处于禁用状态,并且不使用实验性性能功能。

  • -XX:AllocateInstancePrefetchLines=lines
    设置要在实例分配指针之前预取的行数。 默认情况下,要预取的行数设置为 1:
    -XX:AllocateInstancePrefetchLines=1
    只有 Java HotSpot Server VM 支持此选项。

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

    负值表示预取距离是根据平台选择的。 正值是要预取的字节。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认值设置为 -1。

    以下示例显示如何将预取距离设置为 1024 字节:
    -XX:AllocatePrefetchDistance=1024

    只有 Java HotSpot Server VM 支持此选项。

  • -XX:AllocatePrefetchInstr=instruction
    将预取指令设置为在分配指针之前预取。 只有 Java HotSpot Server VM 支持此选项。 可能的值是从 0 到 3。值背后的实际说明取决于平台。 默认情况下,预取指令设置为 0:
    -XX:AllocatePrefetchInstr=0

    只有 Java HotSpot Server VM 支持此选项。

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

    以下示例显示如何将加载的缓存行数设置为 5:
    -XX:AllocatePrefetchLines=5

    只有 Java HotSpot Server VM 支持此选项。

  • -XX:AllocatePrefetchStepSize=size
    设置顺序预取指令的步长(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认情况下,步长设置为 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:CodeCacheMinimumFreeSpace=size
设置编译所需的最小可用空间(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 当剩余空间小于最小可用空间时,编译停止。 默认情况下,此选项设置为 500 KB。 以下示例显示如何将最小可用空间设置为 1024 MB:
-XX:CodeCacheMinimumFreeSpace=1024m

  • -XX:CompileCommand=command,method[,option]
    指定要对方法执行的命令。 例如,要排除 String 类的 indexOf() 方法被编译,请使用以下命令:
    -XX:CompileCommand=exclude,java/lang/String.indexOf
    请注意,完整的类名已指定,包括所有包和子包,用斜杠 (/) 分隔。 为了更轻松地进行剪切和粘贴操作,还可以使用由 -XX:+PrintCompilation-XX:+LogCompilation 选项生成的方法名称格式:
    -XX:CompileCommand=exclude,java.lang.String::indexOf
    如果指定的方法没有签名,则该命令将应用于具有指定名称的所有方法。 但是,您也可以在类文件格式中指定方法的签名。 在这种情况下,您应该将参数括在引号中,否则 shell 会将分号视为命令结束。 例如,如果您只想排除 String 类的 indexOf(String) 方法被编译,请使用以下命令:
    -XX:CompileCommand="exclude,java/lang/String.indexOf,(Ljava/lang/String;)I"
    您还可以使用星号 (*) 作为类和方法名称的通配符。 例如,要排除所有类中的所有 indexOf() 方法被编译,请使用以下命令:
    -XX:CompileCommand=exclude,*.indexOf
    逗号和句点是空格的别名,可以更轻松地通过 shell 传递编译器命令。 您可以通过将参数括在引号中,使用空格作为分隔符将参数传递给 -XX:CompileCommand
    -XX:CompileCommand="exclude java/lang/String indexOf"
    请注意,在使用 -XX:CompileCommand 选项解析命令行上传递的命令后,JIT 编译器会从 .hotspot_compiler 文件中读取命令。 您可以向该文件添加命令或使用“-XX:CompileCommandFile”选项指定其他文件。

    要添加多个命令,请多次指定 -XX:CompileCommand 选项,或者使用换行符 (\n) 分隔每个参数。 以下命令可用:
    break
    调试JVM时设置断点,在指定方法开始编译时停止。
    compileonly
    从编译中排除除指定方法之外的所有方法。 作为替代方案,您可以使用“-XX:CompileOnly”选项,它允许指定多个方法。
    dontinline
    防止内联指定的方法。
    exclude
    从编译中排除指定的方法。
    help
    打印-XX:CompileCommand 选项的帮助信息。
    inline
    尝试内联指定的方法。
    log
    排除除指定方法之外的所有方法的编译日志记录(使用 -XX:+LogCompilation 选项)。 默认情况下,对所有编译方法执行日志记录。
    option
    此命令可用于将 JIT 编译选项传递给指定的方法,以代替最后一个参数 (option)。 编译选项设置在最后,在方法名称之后。 例如,要为 StringBuffer 类的 append() 方法启用 BlockLayoutByFrequency 选项,请使用以下命令:
    -XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency
    您可以指定多个编译选项,以逗号或空格分隔。
    print
    编译指定方法后打印生成的汇编代码。
    quiet
    不要打印编译命令。 默认情况下,打印您使用 -XX:CompileCommand 选项指定的命令; 例如,如果您从编译中排除 String 类的 indexOf() 方法,则以下内容将打印到标准输出:
    CompilerOracle: exclude java/lang/String.indexOf
    您可以通过在其他“-XX:CompileCommand”选项之前指定“-XX:CompileCommand=quiet”选项来抑制这种情况。

  • -XX:CompileCommandFile=filename
    设置从中读取 JIT 编译器命令的文件。 默认情况下,.hotspot_compiler 文件用于存储 JIT 编译器执行的命令。

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

    有关指定 JIT 编译器对方法执行的命令的更多信息,请参阅“-XX:CompileCommand”选项。

  • -XX:CompileOnly=methods
    设置应限制编译的方法列表(以逗号分隔)。 只会编译指定的方法。 用完整的类名(包括包和子包)指定每个方法。 例如,要仅编译 String 类的 length() 方法和 List类的size() 方法,请使用以下代码:
    -XX:CompileOnly=java/lang/String.length,java/util/List.size
    请注意,完整的类名已指定,包括所有包和子包,用斜杠 (/) 分隔。 为了更轻松地进行剪切和粘贴操作,还可以使用由 -XX:+PrintCompilation-XX:+LogCompilation 选项生成的方法名称格式:
    -XX:CompileOnly=java.lang.String::length,java.util.List::size
    虽然不支持通配符,但您可以仅指定类或包名称来编译该类或包中的所有方法,也可以仅指定方法来编译任何类中具有此名称的方法:

    -XX:CompileOnly=java/lang/String
    -XX:CompileOnly=java/lang
    -XX:CompileOnly=.length
    
  • -XX:CompileThreshold=invocations
    设置编译前解释方法调用的数量。 默认情况下,在服务器 JVM 中,JIT 编译器执行 10,000 次解释方法调用来收集信息以进行高效编译。 对于客户端 JVM,默认设置为 1,500 次调用。 启用分层编译时忽略此选项; 请参阅选项-XX:+TieredCompilation。 以下示例显示如何将解释方法调用的次数设置为 5,000:
    -XX:CompileThreshold=5000
    您可以通过指定 -Xcomp 选项在编译之前完全禁用 Java 方法的解释。

  • -XX:+DoEscapeAnalysis
    启用逃逸分析。 默认情况下启用此选项。 要禁用逃逸分析,请指定 -XX:-DoEscapeAnalysis。 只有 Java HotSpot Server VM 支持此选项。

  • -XX:InitialCodeCacheSize=size
    设置初始代码缓存大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认值设置为 500 KB。 初始代码缓存大小应不小于系统的最小内存页面大小。 以下示例显示如何将初始代码缓存大小设置为 32 KB:
    -XX:InitialCodeCacheSize=32k

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

  • -XX:InlineSmallCode=size
    为应该内联的编译方法设置最大代码大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 只有大小小于指定大小的编译方法才会被内联。 默认情况下,最大代码大小设置为 1000 字节:
    -XX:InlineSmallCode=1000

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

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

    每次使用 -XX:+PrintCompilation 选项编译方法时,您都可以启用详细诊断输出,并向控制台打印一条消息。

  • -XX:MaxInlineSize=size
    设置要内联的方法的最大字节码大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认情况下,最大字节码大小设置为 35 个字节:
    -XX:MaxInlineSize=35

  • -XX:MaxNodeLimit=nodes
    设置在单一方法编译期间要使用的最大节点数。 默认情况下,最大节点数设置为 65,000:
    -XX:MaxNodeLimit=65000

  • -XX:MaxTrivialSize=size
    设置要内联的普通方法的最大字节码大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认情况下,普通方法的最大字节码大小设置为 6 个字节:
    -XX:MaxTrivialSize=6

  • -XX:+OptimizeStringConcat
    启用 String 连接操作的优化。 默认情况下启用此选项。 要禁用 String 连接操作的优化,请指定 -XX:-OptimizeStringConcat。 只有 Java HotSpot Server VM 支持此选项。

  • -XX:+PrintAssembly
    通过使用外部 disassembler.so 库启用字节码和本机方法的汇编代码打印。 这使您能够查看生成的代码,这可能有助于您诊断性能问题。

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

  • -XX:+PrintCompilation
    每次编译方法时,通过向控制台打印一条消息,启用 JVM 的详细诊断输出。 这使您能够查看实际编译了哪些方法。 默认情况下,此选项被禁用并且不打印诊断输出。

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

  • -XX:+PrintInlining
    启用内联决策的打印。 这使您能够查看正在内联的方法。

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

  • -XX:ReservedCodeCacheSize=size
    设置 JIT 编译代码的最大代码缓存大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认最大代码缓存大小为 240 MB; 如果您使用选项“-XX:-TieredCompilation”禁用分层编译,则默认大小为 48 MB。 此选项有 2 GB 的限制; 否则,会产生错误。 最大代码缓存大小不应小于初始代码缓存大小; 请参阅选项-XX:InitialCodeCacheSize。 此选项等效于 -Xmaxjitcodesize

  • -XX:RTMAbortRatio=abort_ratio
    RTM 中止率指定为所有已执行 RTM 事务的百分比 (%)。 如果中止事务的数量大于此比率,则编译代码将被取消优化。 当启用 -XX:+UseRTMDeopt 选项时使用此比率。 此选项的默认值为 50。这意味着如果 50% 的事务被中止,编译后的代码将被取消优化。

  • -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 及更新版本)是受支持的硬件。 UseAES 与 UseAESIntrinsics 结合使用。

  • -XX:+UseAESIntrinsics
    UseAES 和 UseAESIntrinsics 标志默认启用,并且仅支持 Java HotSpot Server VM 32 位和 64 位。 要禁用基于硬件的 AES 内在函数,请指定 -XX:-UseAES -XX:-UseAESIntrinsics。 例如,要启用硬件 AES,请使用以下标志:
    -XX:+UseAES -XX:+UseAESIntrinsics
    要支持 32 位和 64 位的 UseAES 和 UseAESIntrinsics 标志,请使用“-server”选项来选择 Java HotSpot Server VM。 客户端 VM 不支持这些标志。

  • -XX:+UseCodeCacheFlushing
    在关闭编译器之前启用代码缓存的刷新。 默认情况下启用此选项。 要在关闭编译器之前禁用代码缓存刷新,请指定 -XX:-UseCodeCacheFlushing。

  • -XX:+UseCondCardMark
    在更新卡片表之前启用检查卡片是否已被标记。 默认情况下禁用此选项,并且只能在具有多个套接字的机器上使用,它将提高严重依赖并发操作的 Java 应用程序的性能。 只有 Java HotSpot Server VM 支持此选项。

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

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

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

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

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

  • -XX:+UseSHA
    为 SPARC 硬件的 SHA 加密哈希函数启用基于硬件的内部函数。 UseSHAUseSHA1IntrinsicsUseSHA256IntrinsicsUseSHA512Intrinsics 选项结合使用。

    UseSHAUseSHA*Intrinsics 标志默认启用,并且仅支持 SPARC T4 和更新版本上的 Java HotSpot Server VM 64 位。

    此功能仅在使用 sun.security.provider.Sun 提供程序进行 SHA 操作时适用。

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

  • -XX:+UseSHA1Intrinsics
    为 SHA-1 加密哈希函数启用内在函数。

  • -XX:+UseSHA256Intrinsics
    为 SHA-224 和 SHA-256 加密哈希函数启用内部函数。

  • -XX:+UseSHA512Intrinsics
    为 SHA-384 和 SHA-512 加密哈希函数启用内部函数。

  • -XX:+UseSuperWord
    支持将标量运算转换为超字运算。 默认情况下启用此选项。 要禁止将标量运算转换为超字运算,请指定“-XX:-UseSuperWord”。 只有 Java HotSpot Server VM 支持此选项。

高级可维护性选项

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

  • -XX:+ExtendedDTraceProbes
    启用影响性能的额外“dtrace”工具探测。 默认情况下,此选项处于禁用状态,dtrace 仅执行标准探测。

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

  • -XX:HeapDumpPath=path
    当设置了 -XX:+HeapDumpOnOutOfMemoryError 选项时,设置用于写入堆分析器 (HPROF) 提供的堆转储的路径和文件名。 默认情况下,该文件在当前工作目录中创建,名为 java_pidpid.hprof,其中 pid 是导致错误的进程的标识符。 以下示例显示如何显式设置默认文件(%p 表示当前进程标识符):
    -XX:HeapDumpPath=./java_pid%p.hprof
    以下示例显示如何将堆转储文件设置为/var/log/java/java_heapdump.hprof
    -XX:HeapDumpPath=/var/log/java/java_heapdump.hprof

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

    以下示例显示如何将日志文件设置为/var/log/java/hotspot.log
    -XX:LogFile=/var/log/java/hotspot.log

  • -XX:+PrintClassHistogram
    Control+C 事件 (SIGTERM) 之后启用类实例直方图的打印。 默认情况下,此选项被禁用。

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

  • -XX:+PrintConcurrentLocks
    Control+C 事件 (SIGTERM) 之后启用 java.util.concurrent 锁的打印。 默认情况下,此选项被禁用。

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

  • -XX:+UnlockDiagnosticVMOptions
    解锁用于诊断 JVM 的选项。 默认情况下,此选项被禁用并且诊断选项不可用。

高级垃圾收集选项

这些选项控制 Java HotSpot VM 执行垃圾收集 (GC) 的方式。

  • -XX:ActiveProcessorCount=x
    覆盖 VM 用于计算线程池大小的 CPU 数量,它用于各种操作,例如垃圾收集和 ForkJoinPool。

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

  • -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:CMSInitiatingOccupancyFraction=percent
    设置开始 CMS 收集周期的老年代占用百分比(0 到 100)。 默认值设置为 -1。 任何负值(包括默认值)都意味着“-XX:CMSTriggerRatio”用于定义初始占用率的值。

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

  • -XX:+CMSScavengeBeforeRemark
    在 CMS 备注步骤之前启用清理尝试。 默认情况下,此选项被禁用。

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

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

  • -XX:ConcGCThreads=threads
    设置用于并发 GC 的线程数。 默认值取决于 JVM 可用的 CPU 数量。

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

  • -XX:+DisableExplicitGC
    启用禁用处理对 System.gc() 调用的选项。 默认情况下禁用此选项,这意味着处理对 System.gc() 的调用。 如果禁用对 System.gc() 调用的处理,JVM 仍会在必要时执行 GC。

  • -XX:+ExplicitGCInvokesConcurrent
    通过使用 System.gc() 请求启用并发 GC 调用。 默认情况下禁用此选项,只能与 -XX:+UseConcMarkSweepGC 选项一起启用。

  • -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
    通过使用 System.gc() 请求并在并发 GC 周期期间卸载类来启用并发 GC 调用。 默认情况下禁用此选项,只能与 -XX:+UseConcMarkSweepGC 选项一起启用。

  • -XX:G1HeapRegionSize=size
    设置使用垃圾优先 (G1) 收集器时 Java 堆被细分的区域大小。 该值可以介于 1 MB 和 32 MB 之间。 默认区域大小是根据堆大小根据人体工程学确定的。

    以下示例显示如何将细分的大小设置为 16 MB:
    -XX:G1HeapRegionSize=16m

  • -XX:+G1PrintHeapRegions
    启用有关哪些区域已分配以及哪些区域已由 G1 收集器回收的信息的打印。 默认情况下,此选项被禁用。

  • -XX:G1ReservePercent=percent
    将保留的堆百分比(0 到 50)设置为假上限,以减少 G1 收集器提升失败的可能性。 默认情况下,此选项设置为 10%。

    以下示例显示如何将保留堆设置为 20%:
    -XX:G1ReservePercent=20

  • -XX:InitialHeapSize=size
    设置内存分配池的初始大小(以字节为单位)。 此值必须为 0 或 1024 的倍数且大于 1 MB。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认值是在运行时根据系统配置选择的。 请参阅 《Java SE HotSpot 虚拟机垃圾收集调优指南》 中的“人体工程学”部分 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html.

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

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

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

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

  • -XX:InitialRAMPercentage=percent
    将 JVM 在应用人体工程学试探法之前用于 Java 堆的初始内存量设置为最大内存量的百分比,如 -XX:MaxRAM 选项中所述。 默认值为 1.5625%。

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

  • -XX:InitialSurvivorRatio=ratio
    设置吞吐量垃圾收集器使用的初始幸存者空间比率(通过 -XX:+UseParallelGC 和/或 -XX:+UseParallelOldGC 选项启用)。 默认情况下,吞吐量垃圾收集器通过使用 -XX:+UseParallelGC 和 -XX:+UseParallelOldGC 选项启用自适应大小调整,并且根据应用程序行为调整幸存者空间的大小,从初始值开始。 如果禁用自适应大小调整(使用 -XX:-UseAdaptiveSizePolicy 选项),则应使用 -XX:SurvivorRatio 选项为应用程序的整个执行设置幸存者空间的大小。

    根据年轻代的大小(Y)和初始幸存者空间比例(R),可以使用以下公式计算幸存者空间的初始大小(S):
    S=Y/(R+2)

    等式中的 2 表示两个幸存者空间。 指定为初始幸存者空间比例的值越大,初始幸存者空间大小越小。

    默认情况下,初始survivor空间比例设置为8。如果新生代空间大小使用默认值(2MB),则survivor空间的初始大小将为0.2MB。

    以下示例显示如何将初始幸存者空间比率设置为 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。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 默认值是在运行时根据系统配置选择的。 对于服务器部署,-XX:InitialHeapSize-XX:MaxHeapSize 通常设置为相同的值。 请参阅_Java SE HotSpot 虚拟机垃圾收集调优指南_中的“人体工程学”部分 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html.

    以下示例显示如何使用各种单位将分配内存的最大允许大小设置为 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%。

    以下示例显示如何将最大可用堆比率设置为 75%:
    -XX:MaxHeapFreeRatio=75

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

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

  • -XX:MaxNewSize=size
    为年轻一代(苗圃)设置堆的最大大小(以字节为单位)。 默认值是根据人体工程学设置的。

  • -XX:MaxRAMPercentage=percent
    将 JVM 在应用人体工程学试探法之前可用于 Java 堆的最大内存量设置为最大内存量的百分比,如 -XX:MaxRAM 选项中所述。 默认值为 25%。

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

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

  • -XX:MaxTenuringThreshold=threshold
    设置用于自适应 GC 大小调整的最大使用期阈值。 最大值为 15。并行(吞吐量)收集器的默认值为 15,CMS 收集器的默认值为 6。

    以下示例显示如何将最大任期阈值设置为 10:
    -XX:MaxTenuringThreshold=10

  • -XX:MetaspaceSize=size
    设置分配的类元数据空间的大小,该空间将在第一次超出时触发垃圾回收。 垃圾回收的阈值根据使用的元数据量增加或减少。 默认大小取决于平台。

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

    以下示例显示如何将最小空闲堆比率设置为 25%:
    -XX:MinHeapFreeRatio=25

  • -XX:MinRAMPercentage=percent
    将 JVM 在应用人体工程学试探法之前可用于 Java 堆的最大内存量设置为最大内存量的百分比,如针对小型堆的 -XX:MaxRAM 选项中所述。 小堆是大约 125 MB 的堆。 默认值为 50%。

    以下示例显示了如何设置用于小型堆的 Java 堆的最大内存量的百分比:
    -XX:MinRAMPercentage=75

  • -XX:NewRatio=ratio
    设置年轻代和老年代大小之间的比例。 默认情况下,此选项设置为 2。以下示例显示如何将年轻/年老比率设置为 1:
    -XX:NewRatio=1

  • -XX:NewSize=size
    为年轻一代(苗圃)设置堆的初始大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。

    堆的年轻代区域用于新对象。 GC 在这个区域比在其他区域更频繁地执行。 如果年轻代的大小太小,那么将会执行大量的次要 GC。 如果大小太高,则只会执行完整的 GC,这可能需要很长时间才能完成。 Oracle 建议您将新生代的大小保持在整个堆大小的一半到四分之一之间。

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

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

    -XX:NewSize 选项等同于 -Xmn

  • -XX:ParallelGCThreads=threads
    设置用于年轻代和老年代并行垃圾回收的线程数。 默认值取决于 JVM 可用的 CPU 数量。

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

  • -XX:+ParallelRefProcEnabled
    启用并行引用处理。 默认情况下,此选项被禁用。

  • -XX:+PrintAdaptiveSizePolicy
    启用有关自适应生成大小调整的信息的打印。 默认情况下,此选项被禁用。

  • -XX:+PrintGC
    在每次 GC 时启用消息打印。 默认情况下,此选项被禁用。

  • -XX:+PrintGCApplicationConcurrentTime
    启用打印自上次暂停(例如,GC 暂停)以来经过的时间。 默认情况下,此选项被禁用。

  • -XX:+PrintGCApplicationStoppedTime
    允许打印暂停(例如,GC 暂停)持续了多长时间。 默认情况下,此选项被禁用。

  • -XX:+PrintGCDateStamps
    启用在每个 GC 上打印日期戳。 默认情况下,此选项被禁用。

  • -XX:+PrintGCDetails
    允许在每次 GC 时打印详细消息。 默认情况下,此选项被禁用。

  • -XX:+PrintGCTaskTimeStamps
    为每个单独的 GC 工作线程任务启用时间戳打印。 默认情况下,此选项被禁用。

  • -XX:+PrintGCTimeStamps
    在每个 GC 上启用时间戳打印。 默认情况下,此选项被禁用。

  • -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 字节在一次清除后幸存并从伊甸园复制到幸存者空间,1 366 864 字节被年龄为 2 的对象占用,等等。每行中的第三个值是年龄为 n 或 较少的。

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

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

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

    以下示例显示如何将值设置为 2.5 秒:
    -XX:SoftRefLRUPolicyMSPerMB=2500

  • -XX:StringDeduplicationAgeThreshold=threshold
    达到指定年龄的“字符串”对象被视为重复数据删除的候选对象。 一个对象的年龄是衡量它在垃圾收集中幸存下来的次数。 这有时被称为任期; 请参阅-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) 的初始大小(以字节为单位)。 附加字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。 如果此选项设置为 0,则 JVM 会自动选择初始大小。

    以下示例显示如何将初始 TLAB 大小设置为 512 KB:
    -XX:TLABSize=512k

  • -XX:+UseAdaptiveSizePolicy
    启用自适应生成大小调整的使用。 默认情况下启用此选项。 要禁用自适应生成大小调整,请指定 -XX:-UseAdaptiveSizePolicy 并明确设置内存分配池的大小(请参阅 -XX:SurvivorRatio 选项)。

  • -XX:+UseCMSInitiatingOccupancyOnly
    允许使用占用值作为启动 CMS 收集器的唯一标准。 默认情况下,此选项被禁用,可以使用其他标准。

  • -XX:+UseConcMarkSweepGC
    为老年代启用 CMS 垃圾收集器。 当吞吐量 (-XX:+UseParallelGC) 垃圾收集器无法满足应用程序延迟要求时,Oracle 建议您使用 CMS 垃圾收集器。 G1 垃圾收集器 (-XX:+UseG1GC) 是另一种选择。

    默认情况下,这个选项是禁用的,收集器是根据机器的配置和 JVM 的类型自动选择的。 启用此选项后,将自动设置 -XX:+UseParNewGC 选项,您不应禁用它,因为以下选项组合已在 JDK 8 中弃用:-XX:+UseConcMarkSweepGC -XX:-UseParNewGC .

  • -XX:+UseG1GC
    启用垃圾优先 (G1) 垃圾收集器的使用。 它是一种服务器风格的垃圾收集器,针对具有大量 RAM 的多处理器机器。 它很有可能满足 GC 暂停时间目标,同时保持良好的吞吐量。 建议将 G1 收集器用于需要大堆(大小约为 6 GB 或更大)且 GC 延迟要求有限(稳定且可预测的暂停时间低于 0.5 秒)的应用程序。

    默认情况下,这个选项是禁用的,收集器是根据机器的配置和 JVM 的类型自动选择的。

  • -XX:+UseGCOverheadLimit
    在抛出 OutOfMemoryError 异常之前,允许使用限制 JVM 在 GC 上花费的时间比例的策略。 默认情况下启用此选项,如果超过 98% 的总时间花在垃圾收集上并且只有不到 2% 的堆被回收,则并行 GC 将抛出一个 OutOfMemoryError。 当堆很小时,可以使用此功能来防止应用程序长时间运行而没有任何进展。 要禁用此选项,请指定 -XX:-UseGCOverheadLimit。

  • -XX:+UseNUMA
    通过增加应用程序对低延迟内存的使用,在具有非统一内存架构 (NUMA) 的机器上启用应用程序的性能优化。 默认情况下,此选项被禁用,并且不对 NUMA 进行优化。 该选项仅在使用并行垃圾收集器时可用(-XX:+UseParallelGC)。

  • -XX:+UseParallelGC
    启用并行清除垃圾收集器(也称为吞吐量收集器)以通过利用多个处理器来提高应用程序的性能。

    默认情况下,这个选项是禁用的,收集器是根据机器的配置和 JVM 的类型自动选择的。 如果启用,则 -XX:+UseParallelOldGC 选项会自动启用,除非您明确禁用它。

  • -XX:+UseParallelOldGC
    启用对完整 GC 的并行垃圾收集器的使用。 默认情况下,此选项被禁用。 启用它会自动启用 -XX:+UseParallelGC 选项。

  • -XX:+UseParNewGC
    启用在年轻代中使用并行线程进行收集。 默认情况下,此选项被禁用。 当您设置 -XX:+UseConcMarkSweepGC 选项时,它会自动启用。 在 JDK 8 中弃用了不使用 -XX:+UseConcMarkSweepGC 选项的-XX:+UseParNewGC 选项。

  • -XX:+UseSerialGC
    启用串行垃圾收集器的使用。 这通常是不需要垃圾收集的任何特殊功能的小型和简单应用程序的最佳选择。 默认情况下,这个选项是禁用的,收集器是根据机器的配置和 JVM 的类型自动选择的。

  • -XX:+UseSHM
    在 Linux 上,使 JVM 能够使用共享内存来设置大页面。

    F有关详细信息,请参阅 "Large Pages".

  • -XX:+UseStringDeduplication
    启用字符串去重。 默认情况下,此选项被禁用。 要使用此选项,您必须启用垃圾优先 (G1) 垃圾收集器。 请参阅-XX:+UseG1GC选项。

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

  • -XX:+UseTLAB
    启用在新生代空间中使用线程本地分配块 (TLAB)。 默认情况下启用此选项。 要禁用 TLAB,请指定“-XX:-UseTLAB”。

弃用和删除的选项

这些选项包含在以前的版本中,但后来被认为是不必要的。

  • -Xincgc
    启用增量垃圾收集。 此选项在 JDK 8 中已弃用,没有替代品。

  • -Xrun_libname_
    加载指定的调试/分析库。 此选项已被 -agentlib 选项取代。

  • -XX:CMSIncrementalDutyCycle=percent
    设置允许并发收集器运行的次要收集之间的时间百分比(0 到 100)。 在弃用-XX:+CMSIncrementalMode 选项后,此选项在 JDK 8 中已弃用且没有替代品。

  • -XX:CMSIncrementalDutyCycleMin=percent
    设置次要收集之间的时间百分比(0 到 100),这是启用“-XX:+CMSIncrementalPacing”时占空比的下限。 在弃用-XX:+CMSIncrementalMode 选项后,此选项在 JDK 8 中已弃用且没有替代品。

  • -XX:+CMSIncrementalMode
    为 CMS 收集器启用增量模式。 此选项在 JDK 8 中已弃用,没有替代品,以及其他以 CMSIncremental 开头的选项。

  • -XX:CMSIncrementalOffset=percent
    设置增量模式占空比在次要收集之间的时间段内向右移动的时间百分比(0 到 100)。 在弃用-XX:+CMSIncrementalMode 选项后,此选项在 JDK 8 中已弃用且没有替代品。

  • -XX:+CMSIncrementalPacing
    根据 JVM 运行时收集的统计信息,启用增量模式占空比的自动调整。 在弃用-XX:+CMSIncrementalMode 选项后,此选项在 JDK 8 中已弃用且没有替代品。

  • -XX:CMSIncrementalSafetyFactor=percent
    设置计算占空比时用于添加保守性的时间百分比(0 到 100)。 在弃用-XX:+CMSIncrementalMode 选项后,此选项在 JDK 8 中已弃用且没有替代品。

  • -XX:CMSInitiatingPermOccupancyFraction=percent
    设置启动 GC 的永久代占用百分比(0 到 100)。 此选项在 JDK 8 中已弃用,没有替代品。

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

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

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

  • -XX:+UseStringCache
    启用缓存通常分配的字符串。 此选项已从 JDK 8 中删除,没有替代。

性能调优示例

以下示例展示了如何使用实验性调整标志来优化吞吐量或提供更短的响应时间。

示例 1 - 调整以提高吞吐量

java -d64 -server -XX:+AggressiveOpts -XX:+UseLargePages -Xmn10g  -Xms26g -Xmx26g

示例 2 - 调优以缩短响应时间

java -d64 -XX:+UseG1GC -Xms26g Xmx26g -XX:MaxGCPauseMillis=500 -XX:+PrintGCTimeStamp

大页面

也称为巨大页面,大页面是显着大于标准内存页面大小(取决于处理器和操作系统)的内存页面。 大页面优化处理器翻译后备缓冲区。

转换后备缓冲区 (TLB) 是一种页面转换缓存,用于保存最近使用的虚拟到物理地址转换。 TLB 是一种稀缺的系统资源。 TLB 未命中可能代价高昂,因为处理器必须从分层页表中读取,这可能需要多次内存访问。 通过使用更大的内存页面大小,单个 TLB 条目可以表示更大的内存范围。 TLB 的压力会更小,内存密集型应用程序可能会有更好的性能。

但是,大页面页面内存会对系统性能产生负面影响。 例如,当应用程序固定大量内存时,可能会造成常规内存不足并导致其他应用程序过度分页并降低整个系统的速度。 此外,长时间运行的系统可能会产生过多的碎片,这可能导致无法预留足够大的页面内存。 发生这种情况时,操作系统或 JVM 将恢复使用常规页面。

大页面支持

Solaris 和 Linux 支持大页面。

Solaris

Solaris 9 及更高版本包括多页大小支持 (MPSS); 无需额外配置。 参阅 https://docs.oracle.com/cd/E19683-01/816-5027/6mb6t2rmd/index.html.

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,请指定大页面的数量。 在下面的例子中,4GB系统中的3GB预留给大页面(假设大页面大小为2048kB,那么3GB=31024MB=3072MB=30721024kB=3145728kB和3145728kB/2048 kB = 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 可能无法在大页面上分配代码缓存区域,因为这些区域的大小非常大。

应用类数据共享

应用程序类数据共享 (AppCDS) 扩展了 CDS(请参阅 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html) 以启用标准扩展目录中的类(由系统属性 java.ext.dirs 指定;参见 https://docs.oracle.com/javase/8/docs/technotes/guides/extensions/spec.html) 和要放置的应用程序类路径(请参阅 "Setting the Class Path") 在共享存档中。 如果从应用程序类路径加载大量类,AppCDS 可以减少应用程序的占用空间并缩短启动时间。

这是一项商业功能,需要您还指定“-XX:+UnlockCommercialFeatures”选项。 这也是一项实验性功能; 它可能会在未来的版本中改变。

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

以下步骤创建一个共享存档文件,其中包含 test.Hello 应用程序使用的所有类。 最后一步使用共享存档文件运行应用程序。

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

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

    请注意,-cp 参数必须仅包含 JAR 文件; -XX:+UseAppCDS 选项不支持包含目录名称的类路径。

  2. 创建一个名为“hello.jsa”的共享存档,其中包含“hello.classlist”中的所有类:

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

    请注意,在存档创建时使用的 -cp 参数必须与在运行时使用的 -cp 相同(或其前缀)。

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

    java -XX:+UnlockCommercialFeatures -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello

    确保您已指定选项-Xshare:on 或 -Xshare:auto

  4. 验证 test.Hello 应用程序正在使用 hello.jsa 共享存档中包含的类:

    java -XX:+UnlockCommercialFeatures -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar -verbose:class test.Hello

    此命令的输出应包含以下文本:

    Loaded test.Hello from shared objects file by sun/misc/Launcher$AppClassLoader

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

您可以在具有完全相同类路径或共享公共类路径前缀的多个应用程序进程之间共享同一个归档文件。 这减少了内存使用,因为存档被内存映射到进程的地址空间。 操作系统自动在这些进程之间共享只读页面。

以下步骤创建一个共享存档,应用程序“Hello”和“Hi”都可以使用。

  1. 创建一个包含Hello 应用程序使用的所有类的列表和另一个用于Hi 应用程序的列表:

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

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

    请注意,由于 HelloHi 应用程序共享一个公共类路径前缀(它们的类路径都以 common.jar 开头),这两个应用程序可以共享一个共享归档文件。

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

    以下命令将文件 hello.classlisthi.classlist 合并为一个文件 common.classlist

    cat hello.classlist hi.classlist > common.classlist

  3. 创建一个名为 common.jsa 的共享存档,其中包含 common.classlist 中的所有类:

    java -XX:+UnlockCommercialFeatures -Xshare:dump -XX:SharedArchiveFile=common.jsa -XX:+UseAppCDS -XX:SharedClassListFile=common.classlist -cp common.jar

    -cp 参数的值是由 HelloHi 应用程序共享的公共类路径前缀。

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

    java -XX:+UnlockCommercialFeatures -Xshare:on -XX:SharedArchiveFile=common.jsa -XX:+UseAppCDS -cp common.jar:hello.jar Hello

    java -XX:+UnlockCommercialFeatures -Xshare:on -XX:SharedArchiveFile=common.jsa -XX:+UseAppCDS -cp common.jar:hi.jar Hi

退出状态

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

  • 0: Successful completion
  • >0: An error occurred

See Also

posted @ 2023-05-14 02:58  紫零大仙  阅读(119)  评论(0编辑  收藏  举报