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] 可选项:命令行选项,以空格分隔。

mainclass 要启动的类名。classname后面的命令行条目是main方法的参数。

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

-m 或 --module module[/mainclass]执行由mainclass指定的模块中的main类,如果它被指定,或者,如果它没有被指定,则在模块中执行。换句话说,mainclass可以在未由模块指定时使用,或者在指定时覆盖该值。

source-file 仅用于启动单个源文件程序。指定使用源文件模式时包含主类的源文件。

[args…] 可选项:mainclass、source-file、-jar jarfile和-m或–module module/mainclass后面的参数作为参数传递给main类。

描述

java命令用来启动java应用程序。它通过启动Java Runtime Environment、加载指定的类并调用该类的main()方法来实现这一点。该方法必须声明为公有和静态的,它不能返回任何值,并且必须接受String数组作为参数。方法声明的形式如下:

class HelloWorld {
    public static void main(String[] args) { }
}

在源文件模式下,java命令可以启动在源文件中声明的类。

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

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

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

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

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

如果存在–source版本选项。

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

如果文件没有.java扩展名,则必须使用–source选项来告诉java命令使用源文件模式。当源文件是要执行的“脚本”,并且源文件的名称不遵循Java源文件的常规命名约定时,使用–source选项。

在源文件模式下,效果就好像源文件被编译到内存中,然后执行源文件中找到的第一个类。在原始命令行中,位于源文件名称之后的任何参数都在执行时传递给已编译类。

例如,如果一个名为HelloWorld.java的文件包含一个名为hello. java的类。,则启动类的源文件模式命令为:

java HelloWorld.java

这个示例说明了类可以在命名包中,而不需要在未命名包中。当hello.World是包中的类名,这种源文件模式的使用在非正式意义上等同于使用下面两个命令:

javac -d memory HelloWorld.java
java -cp memory hello.World

在源文件模式下,任何额外的命令行选项将按如下方式处理:

  • 启动程序扫描源文件之前指定的选项,以便编译源文件。
    这包括:–class-path,–module-path,–add-exports,–add-modules,–limit-modules,–patch-module,–upgrade-module-path,以及这些选项的任何变体形式。它还包括–enable-preview选项,在JEP 12:预览语言和虚拟机特性中描述。
  • 没有规定向编译器传递任何附加选项,如-processor或-Werror。
  • 命令行参数文件(@-files)可以以标准方式使用。VM或被调用程序的长参数列表可以放在命令行中指定的文件中,方法是在文件名前加上@字符。

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

  • 所有与编译环境相关的命令行选项都要考虑在内。
  • 没有找到其他源文件并进行编译,就好像源路径被设置为空值一样。
  • 注释处理被禁用,就像-proc:none有效一样。
  • 如果通过–source选项指定了版本,则该值将用作编译时隐式的–release选项的参数。这设置了编译器接受的源版本,以及源文件中的代码可能使用的系统API。
  • 源文件在未命名模块的上下文中编译。
  • 源文件应该包含一个或多个顶级类,其中第一个作为要执行的类。
  • 编译器不会强制执行JLS§7.6末尾定义的可选限制,即命名包中的类型应该存在于文件名由类型名后跟.java扩展名组成的文件中。
  • 如果源文件包含错误,则将适当的错误消息写入标准错误流,启动程序将以非零的退出代码退出。

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

  • 要执行的类是在源文件中找到的第一个顶级类。它必须包含标准公共静态void main(String[])方法的声明。
  • 编译后的类由自定义的类加载器加载,并委托给应用程序类加载器。这意味着出现在应用程序类路径上的类不能引用源文件中声明的任何类。
  • 编译后的类在未命名模块的上下文中执行,就像–add-modules=ALL-DEFAULT生效一样。这是对命令行中可能指定的任何其他–add-module选项的补充。
  • 命令行中出现在文件名之后的任何参数都以明显的方式传递给标准的main方法。
  • 如果应用程序类路径上有一个类的名称与要执行的类的名称相同,则会出现错误。

使用JDK_JAVA_OPTIONS启动器环境变量

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

单```或双"引号可以用来包围包含空白字符的参数。只要删除这对引号,就可以保留左引号和第一个匹配的右引号之间的所有内容。如果没有找到匹配的引号,启动程序将中止并返回错误消息。支持@-files,因为它们是在命令行中指定的。但是,与@-files一样,不支持使用通配符。为了减少JDK_JAVA_OPTIONS行为的潜在误用,在环境变量中不允许指定主类(如-jar)或导致java启动程序退出而不执行主类(如-h)的选项。如果这些选项中的任何一个出现在环境变量中,启动程序将中止并显示错误消息。当设置了JDK_JAVA_OPTIONS时,启动器将向stderr打印一条消息作为提醒。
例子:

export JDK_JAVA_OPTIONS='-g @file1 -Dprop=value @file2 -Dws.prop="white spaces"' 

java -Xint @file3

等价于命令行:

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

Java选项概述

java命令支持以下类别中的广泛选项:

  • Java的标准选项:Java虚拟机(JVM)的所有实现保证支持的选项。它们用于常见的操作,例如检查JRE版本、设置类路径、启用详细输出等等。
  • Java的额外选项:特定于Java热点虚拟机的通用选项。它们不能保证得到所有JVM实现的支持,并且可能会发生变化。这些选项以-X开头。

不建议随意使用高级选项。这些是用于调优Java HotSpot Virtual Machine操作的特定领域的开发人员选项,这些操作通常有特定的系统需求,可能需要对系统配置参数的特权访问。性能调优示例中提供了几个性能调优示例。这些选项并不能保证得到所有JVM实现的支持,并且可能会发生变化。高级选项以-XX开头。

  • 高级运行时选项:控制Java HotSpot虚拟机的运行时行为。
  • 高级JIT编译器选项:控制Java HotSpot VM执行的动态JIT (just-in-time)编译。
  • 高级可服务性选项:启用收集系统信息和执行广泛的调试。
  • 高级垃圾收集选项:控制Java HotSpot如何执行垃圾收集(GC)
    布尔选项用于启用默认禁用的特性或禁用默认启用的特性。这些选项不需要参数。Boolean -XX选项使用加号(-XX:+OptionName)启用,使用减号(-XX:-OptionName)禁用。

对于需要参数的选项,参数可以用空格、冒号(:)或等号(=)与选项名分开,或者参数可以直接跟在选项后面(每个选项的语法不同)。如果希望以字节为单位指定大小,那么可以不使用后缀,或者使用后缀k或k表示千字节(KB), m或m表示兆字节(MB), g或g表示千兆字节(GB)。例如,要将大小设置为8gb,可以指定8g、8192m、8388608k或8589934592作为参数。如果您希望指定百分比,则使用0到1之间的数字。例如,为25%指定0.25。

Java的标准选项

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

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

  • Linux和macOS:如果指定了-agentlib:foo选项,那么JVM将尝试加载名为libfoo的库。因此,在LD_LIBRARY_PATH系统变量指定的位置(在macOS上,这个变量是DYLD_LIBRARY_PATH)。
  • Windows:如果指定了选项-agentlib:foo,那么JVM将尝试在PATH系统变量指定的位置加载名为foo.dll的库。

下面的示例展示了如何加载Java Debug Wire Protocol (JDWP)库并侦听端口8000上的套接字连接,在主类加载之前挂起JVM:

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

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

–class-path classpath, -classpath classpath,或-cp classpath用分号(;)分隔的目录、JAR存档和ZIP存档列表,用于搜索类文件。

指定类路径将覆盖classpath环境变量的任何设置。如果未使用类路径选项,且未设置类路径,则用户类路径由当前目录(.)组成。

作为一种特殊的便利,包含星号()基名的类路径元素被认为等同于指定扩展名为.jar或.JAR的目录中所有文件的列表。Java程序无法区分这两个调用之间的区别。例如,如果目录mydir包含a.jar和b.JAR,那么类路径元素mydir/将被展开为a.jar:b.JAR,只是JAR文件的顺序没有指定。指定目录下的所有.jar文件,甚至是隐藏的文件,都包含在列表中。由星号(*)组成的类路径条目展开为当前目录中所有jar文件的列表。定义的CLASSPATH环境变量以类似的方式展开。任何类路径通配符扩展都发生在Java VM启动之前。除非通过查询环境,例如通过调用System.getenv(“CLASSPATH”),Java程序永远不会看到不展开的通配符。
–disable-@files 可以在命令行中的任何地方使用,包括在参数文件中,以防止@filename进一步展开。该选项在选项之后停止展开@-argfiles。

–enable-preview 允许类依赖于发布版的预览特性。

–module-path modulepath… 或-p modulepath 用分号(;)分隔的目录列表,其中每个目录是模块目录。

–upgrade-module-path modulepath……用分号(;)分隔的目录列表,其中每个目录都是替换运行时映像中可升级模块的模块目录。

–add-modules module[,module…] 指定要解析的根模块和初始模块。module也可以是ALL-DEFAULT、ALL-SYSTEM和ALL-MODULE-PATH。

–list-modules 列出可观察模块然后退出。

-d module-name或–description -module module-name 描述指定的模块,然后退出。

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

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

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

-disableassertions[:[packagename]…|:classname] 或 -da[:[packagename]…|:classname] 禁用断言。默认情况下,断言在所有包和类中都禁用。如果没有参数,-disableassertions (-da)将禁用所有包和类中的断言。packagename参数以…结尾,该开关禁用指定包和任何子包中的断言。如果这个参数是简单的…,则开关禁用当前工作目录中的未命名包中的断言。使用classname参数,开关禁用指定类中的断言。

-disableassertions (-da) 选项适用于所有类加载器和系统类(没有类加载器)。这条规则有一个例外:如果选项没有提供参数,那么它就不适用于系统类。这使得在除系统类之外的所有类中禁用断言变得很容易。选项-disablesystemassertions允许在所有系统类中禁用断言。要显式地在特定的包或类中启用断言,使用-enableassertions (-ea)选项。这两个选项可以同时使用。例如,要运行MyClass应用程序,在包com.wombat.fruitbat(和任何子包)中启用断言,但在类com.wombat.fruitbat.Brickbat中禁用断言,使用以下命令:

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

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

-enableassertions[:[packagename]…|:classname] 或-ea[:[packagename]…|:classname] 开启断言。默认情况下,断言在所有包和类中都禁用。如果没有参数,-enableassertions (-ea)会在所有包和类中启用断言。packagename参数以…结尾,该开关启用指定包和任何子包中的断言。如果这个论点是简单的…,则该开关启用当前工作目录中的未命名包中的断言。使用classname参数,该开关启用指定类中的断言。

-enableassertions (-ea)选项适用于所有类加载器和系统类(没有类装入器)。这条规则有一个例外:如果选项没有提供参数,那么它就不适用于系统类。这使得在除系统类之外的所有类中启用断言变得很容易。

选项-enablesystemassertions提供了一个单独的开关,用来在所有系统类中启用断言。要显式禁用特定包或类中的断言,请使用-disableassertions (-da)选项。如果一个命令包含这些开关的多个实例,那么在加载任何类之前,将按顺序处理它们。例如,要运行只在包com.wombat.fruitbat(和任何子包)中启用断言而在类com.wombat.fruitbat中禁用断言的MyClass应用程序,使用以下命令:

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

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

-help, -h还是-?将帮助消息打印到错误流。

–help将帮助消息打印到输出流。

-javaagent:jarpath[=options]加载指定的Java编程语言代理。

–show-version将产品版本打印到输出流并继续。

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

–show-module-resolution显示启动时模块分辨率输出。

-splash:imagepath显示带有imagepath指定的图像的启动画面。HiDPI缩放图像自动支持和使用,如果可用。未缩放的图像文件名,如image.Ext,应该始终作为参数传递给-splash选项。所提供的最合适的缩放图像将自动提取。

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

-splash:images/splash.gif

-verbose:class显示每个加载的类的信息。

-verbose:gc显示每个gc (garbage collection)事件的信息。

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

-verbose:module显示正在使用的模块信息。

–version将产品版本打印到错误流并退出。

-version将产品版本打印到输出流并退出。

-X打印错误流中额外选项的帮助。

–help-extra将额外选项的帮助打印到输出流。

@argfile java命令使用的一个或多个以@为前缀的参数文件。java命令行由于类路径中需要.jar文件而变得很长,这种情况并不少见。@argfile选项通过允许启动程序在shell展开之后但在参数处理之前展开参数文件的内容,克服了命令行长度的限制。参数文件中的内容将被展开,因为否则,它们将在命令行上指定,直到遇到-Xdisable-@files选项。

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

java @argfile

Java命令的额外选项

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

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

-Xbootclasspath/a:directories|zip|JAR-files指定附加到默认引导类路径末尾的目录、JAR文件和zip归档文件列表。

  • Linux和macOS:用冒号(:)分隔列表中的实体。
  • Windows:分号(;)分隔列表中的实体。

-Xcheck:jni 对jni (Java Native Interface)函数执行额外的检查。具体来说,它在处理JNI请求之前验证传递给JNI函数的参数和运行时环境数据。它还检查JNI调用之间的挂起异常。遇到的任何无效数据都表明本机代码中存在问题,在这种情况下,JVM会以不可恢复的错误终止。使用此选项时,性能可能会下降。

-Xcomp强制方法在第一次调用时进行编译。默认情况下,Client VM (-client)执行1000次解释方法调用,Server VM (-server)执行10000次解释方法调用以收集信息以进行有效编译。指定-Xcomp选项将禁用解释方法调用,以牺牲效率来提高编译性能。您还可以使用-XX:CompileThreshold选项更改编译前解释方法调用的数量。

  • xdebug 什么也不做。提供向后兼容性。

-Xdiag 显示其他诊断消息。

-Xfuture 启用严格的类文件格式检查,强制严格遵守类文件格式规范。开发人员在开发新代码时应该使用这个标志。在未来的版本中,更严格的检查可能会成为默认做法。

-Xint 以仅解释模式运行应用程序。对本机代码的编译被禁用,所有字节码都由解释器执行。在这种模式下,即时(JIT)编译器提供的性能优势不存在。

-Xinternalversion 显示比-version选项更详细的JVM版本信息,然后退出。

-Xloggc:option 启用JVM统一日志框架。将GC状态记录到一个带有时间戳的文件中。

-Xlog:option 使用Java虚拟机(JVM)统一日志框架配置或启用日志。请参见使用JVM统一日志框架启用日志记录。

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

-Xmn size设置年轻代(托儿所)堆的初始大小和最大大小(以字节为单位)。加上字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。堆的年轻代区域用于新对象。与其他区域相比,该区域执行GC的频率更高。如果年轻代的大小太小,那么将执行大量次要垃圾收集。如果大小太大,则只执行完整的垃圾收集,这可能需要很长时间才能完成。

Oracle建议将年轻代的大小保持在总体堆大小的25%和50%以下。下面的示例演示如何使用不同的单位将年轻代的初始大小和最大大小设置为256mb:

-Xmn256m
-Xmn262144k
-Xmn268435456

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

-Xms size 设置堆的最小和初始大小(以字节为单位)。该值必须为1024的倍数,且大于1MB。加上字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。下面的例子展示了如何使用不同的单位将分配的内存大小设置为6MB:

-Xms6291456
-Xms6144k
-Xms6m

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

-Xmx size 内存分配池的最大大小,单位为字节。k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。默认值是在运行时根据系统配置选择的。对于服务器部署,-Xms和-Xmx通常设置为相同的值。下面的例子展示了如何使用不同的单位设置最大允许分配的内存大小为80MB:

-Xmx83886080
-Xmx81920k
-Xmx80m

-Xmx选项等价于-XX:MaxHeapSize。

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

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

  • Linux和macOS:
  • JVM捕获信号以实现意外终止的关闭钩子。JVM使用SIGHUP、SIGINT和SIGTERM来启动关闭钩子的运行。
  • 嵌入JVM的应用程序经常需要捕获信号,如SIGINT或SIGTERM,这可能导致对JVM信号处理程序的干扰。可以使用-Xrs选项来解决这个问题。当使用-Xrs时,JVM不会更改SIGINT、SIGTERM、SIGHUP和SIGQUIT的信号掩码,也不会安装这些信号的信号处理程序。
  • Windows:
  • JVM监视控制台控制事件,以实现意外终止的关闭钩子。具体地说,JVM注册一个控制台控制处理程序,它开始处理关闭钩子并对CTRL_C_EVENT、CTRL_CLOSE_EVENT、CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT返回TRUE。
  • JVM使用类似的机制来实现为调试目的转储线程堆栈的特性。JVM使用CTRL_BREAK_EVENT执行线程转储。
  • 如果JVM作为服务运行(例如,作为web服务器的servlet引擎),那么它可以接收CTRL_LOGOFF_EVENT,但不应该启动关闭,因为操作系统实际上不会终止进程。为了避免这种可能的干扰,可以使用-Xrs选项。当使用-Xrs选项时,JVM不会安装控制台控制处理程序,这意味着它不会监视或处理CTRL_C_EVENT、CTRL_CLOSE_EVENT、CTRL_LOGOFF_EVENT或CTRL_SHUTDOWN_EVENT。

指定-Xrs有两个结果:

  • Linux和macOS: SIGQUIT线程转储不可用。
  • Windows: Ctrl + Break线程转储不可用。
    用户代码负责导致关闭钩子运行,例如,在JVM要终止时调用System.exit()。

-Xshare:mode 设置类数据共享(CDS)模式。

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

auto 如果可能的话使用CDS 。这是Java HotSpot 32位客户端虚拟机的默认值。

on 要求使用CDS。如果不能使用类数据共享,此选项将打印错误消息并退出。

off 指示不要使用CDS 。

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

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

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

locale 显示与locale相关的设置。

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

vm 显示JVM设置。

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

-Xss size 设置线程堆栈大小(单位为字节)。k或K表示KB, m或M表示MB, g或G表示GB。默认值取决于平台:

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

这个选项类似于-XX:ThreadStackSize。

-Xverify 设置字节码校验器的模式。

–add-reads module=target-module(,target-module)* 更新模块以读取目标模块,而不管模块声明是什么。目标模块可以全部未命名以读取所有未命名模块。

–add-exports module/package=target-module(,target-module)目标模块可以全部未命名,以导出到所有未命名模块。

–add-open module/package=target-module(,target-module)*更新模块以打开包到目标模块,不管模块声明。

–illegal-access=parameter 当在运行时出现时,–illegal-access= 接受一个关键字参数来指定操作模式:

  • permit:这种模式打开运行时映像中每个模块中的每个包,在所有未命名的模块(比如类路径上的代码)中编码,如果这个包存在于JDK 8中。这既支持静态访问(例如,通过编译的字节码),也支持通过平台的各种反射api进行深度反射访问。对任何此类包的第 - 一个反射访问操作将导致发出警告。但是,在第一次出现后不会发出警告。此警告描述如何启用进一步的警告。此模式是当前JDK的默认模式,但将在未来的版本中更改。
  • warn:此模式与permit相同,只是对每个非法的反射访问操作都会发出警告消息。
  • debug:此模式与warn模式相同,只是对每个非法的反射访问操作都发出警告消息和堆栈跟踪。
  • deny:该模式禁用所有非法访问操作,其他命令行选项(如–add-open)启用的操作除外。在以后的版本中,该模式将成为默认模式。

默认模式–illegal-access=permit 旨在让您知道类路径上至少一次反射访问任何jdk内部api的代码。要了解所有此类访问,可以使用警告或调试模式。对于类路径上需要非法访问的每个库或框架,您有两个选项:

如果组件的维护者已经发布了一个不再使用jdk内部api的固定版本,那么您可以考虑升级到该版本。
如果组件仍然需要修复,那么您可以联系它的维护人员,让他们使用适当的导出api替换jdk内部api。
如果必须继续使用需要非法访问的组件,那么可以使用一个或多个–add- opens选项只打开需要访问的那些内部包,从而消除警告消息。

要验证您的应用程序是否已经为JDK的未来版本做好了准备,请使用–illegal-access=deny和任何必要的–add- opens选项运行它。任何剩余的非法访问错误很可能是由于从编译代码到jdk内部api的静态引用。您可以通过运行带有–jdk-internals选项的jdeps工具来识别它们。出于性能原因,当前JDK不会对非法静态访问操作发出警告。

–limit-modules module[,module…] 指定可观察模块的范围。

–patch-module module=file(;file)* 使用JAR文件或目录中的类和资源覆盖或扩充模块。

–disable-@files 可以在命令行中的任何地方使用,包括在参数文件中,以防止@filename进一步展开。该选项在选项之后停止展开@-argfiles。

–source version 设置源文件模式下的版本。

MacOS的额外选项

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

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

-Xdock:name=application_name 覆盖dock中显示的默认应用名称。

-Xdock:icon=path_to_icon_file 覆盖dock中的默认图标。

高级运行时选项

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

-XX:ActiveProcessorCount=x 覆盖虚拟机将使用的cpu数量,以计算线程池的大小,它将使用各种操作,如垃圾收集和ForkJoinPool。

VM通常决定操作系统中可用处理器的数量。当在docker容器中运行多个Java进程时,此标志对于分区CPU资源非常有用。即使UseContainerSupport未启用,此标志也将被尊重。有关启用和禁用容器支持的描述,请参见-XX:-UseContainerSupport。

–XX:AllocateHeapAt=path 获取文件系统的路径,并使用内存映射在内存设备上分配对象堆。使用此选项,HotSpot虚拟机可以将Java对象堆分配到用户指定的替代内存设备上,例如NV-DIMM。

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

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

-XX:-CompactStrings 禁用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的机制。默认情况下,该选项是禁用的,这意味着附加机制是启用的,您可以使用诊断和故障排除工具,如jcmd、jstack、jmap和jinfo。

-XX:ErrorFile=filename 当发生不可恢复的错误时,将错误数据写入的路径和文件名。默认情况下,该文件在当前工作目录中创建,命名为hs_err_pidd .log,其中pid是导致错误的进程的标识符。

下面的示例演示如何设置默认日志文件(注意,进程的标识符被指定为%p):

-XX:ErrorFile=./hs_err_pid%p.log
  • Linux和macOS操作系统:以“/var/log/java/java_error.log”为例进行说明
  • XX: ErrorFile = /var/log/java/java_error.log ```
  • Windows操作系统:将错误日志文件设置为“C:/log/java/java_error.log: ```shell
  • XX: ErrorFile = C: /日志/ java / java_error.log ```
    如果文件不能在指定的目录中创建(由于空间不足、权限问题或其他问题),则在操作系统的临时目录中创建文件:
  • Linux和macOS: 临时目录为“/tmp”。
  • Windows: 临时目录由TMP环境变量的值指定。如果没有定义该环境变量,则使用TEMP环境变量的值。

-XX:+ExtensiveErrorReports 允许在ErrorFile中报告更广泛的错误信息。在需要最大信息的环境中可以打开此选项 - 即使生成的日志可能相当大,并且/或包含可能被认为是敏感的信息。不同版本和不同平台的信息可能不同。默认情况下,该选项是禁用的。

-XX:+FailOverToOldVerifier 当新类型校验器失败时,自动切换到旧的校验器。默认情况下,该选项是禁用的,对于具有最新字节码版本的类,它将被忽略(即视为禁用)。您可以为使用较旧版本字节码的类启用它。

-XX:+FlightRecorder 允许在应用程序运行时使用JFR (Java FlightRecorder)。

-XX:FlightRecorderOptions=parameter=value 设置控制JFR行为的参数。

下面的列表包含了可用的JFR参数=value条目:

allow_threadbuffers_to_disk={true|false} 如果缓冲区线程被阻塞,是否会将线程缓冲区直接写入磁盘。缺省情况下,该参数为禁用状态。

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

maxchunksize=size 记录中数据块的最大大小(单位为字节)。附加m或M以指定大小,单位为兆字节(MB),附加g或G以指定大小,单位为千兆字节(GB)。默认情况下,最大数据块大小为12mb,最小数据块大小为1mb。

memorysize=size 决定应该使用多少缓冲内存,并根据指定的大小设置globalbuffersize和numglobalbuffers参数。附加m或M以指定大小,单位为兆字节(MB),附加g或G以指定大小,单位为千兆字节(GB)。默认情况下,内存大小为10mb。

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 每个线程的本地缓冲区大小(单位为字节)。缺省情况下,本地缓冲区大小设置为8kb。重写此参数可能会降低性能,因此不建议重写。

可以为多个参数指定值,参数之间用逗号分隔。

-XX:InitiatingHeapOccupancyPercent=n 设置触发标记周期的Java堆占用阈值。默认的占用率是整个Java堆的45%。

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

设置大页面大小为4mb的示例如下:

-XX:LargePageSizeInBytes=4m

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

下面的示例演示如何以不同的单位将NIO大小设置为1024kb:

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

-XX:-MaxFDLimit 禁用将打开的文件描述符数量的软限制设置为硬限制的尝试。默认情况下,该选项在所有平台上都是启用的,但在Windows上被忽略。唯一需要禁用此功能的时候是在Mac OS上,它的使用限制了最大10240,低于实际的系统最大值。

-XX:MaxGCPauseMillis=ms 设置目标的最大暂停时间。缺省值是200毫秒。指定的值不适合您的堆大小。

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

off 指示不要跟踪JVM本机内存使用情况。如果没有指定-XX: nativemorytracking选项,这是默认行为。

summary 只跟踪JVM子系统(如Java堆、类、代码和线程)的内存使用情况。

detail 除了跟踪JVM子系统的内存使用情况,还可以跟踪单个CallSite、单个虚拟内存区域及其提交区域的内存使用情况。

-XX:ObjectAlignmentInBytes=alignment 设置Java对象的内存对齐方式(以字节为单位)。缺省值为8字节。指定的值应该是2的幂,并且必须在8和256(包括)的范围内。这个选项使得使用具有大Java堆大小的压缩指针成为可能。

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

4GB * ObjectAlignmentInBytes

-XX:OnError=string 设置一个自定义命令或一系列以分号分隔的命令,当不可恢复的错误发生时运行。如果字符串包含空格,则必须用引号括起来。

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

-XX:OnError="gcore %p;dbx - %p"
  • Windows:以下示例显示如何使用-XX:OnError选项来运行userdump.exe工具,在出现不可恢复的错误(%p指定当前进程)时获取崩溃转储。本例假设userdump.exe实用程序的路径是在path环境变量中指定的
  • XX:OnError=“userdump.exe %p” ```
    -XX:OnOutOfMemoryError=string 设置一个自定义命令或一系列分号分隔的命令,当OutOfMemoryError第一次抛出时运行。如果字符串包含空格,则必须用引号括起来。有关命令字符串的示例,请参见-XX:OnError选项的描述。

-XX:ParallelGCThreads=n 设置STW工作线程的值。将n的值设置为逻辑处理器的数量。n的值等于8以内的逻辑处理器的数量。如果有超过8个逻辑处理器,那么这个选项将n的值设置为大约5/8个逻辑处理器。除了更大的SPARC系统外,大多数情况下这都是可行的,在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:本机内存跟踪)。默认情况下,该选项是禁用的,本机内存跟踪数据不会打印。

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

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

-XX:SharedArchiveConfigFile=shared_config_file 添加到归档文件的额外共享数据。

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

java/lang/Object
hello/Main

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

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

-XX:StartFlightRecording=parameter=value 为Java应用程序启动JFR记录。这个选项相当于JFR。启动诊断命令,在运行时启动记录。在启动JFR录音时,可以设置以下parameter=value项:

delay=time从Java应用程序启动到开始记录之间的延迟时间。附加s以指定以秒为单位的时间,m代表分钟,h代表小时,d代表天。例如,指定10m表示10分钟。默认情况下,没有延迟,这个参数设置为0。

disk={true|false} 记录时是否将数据写入磁盘。缺省情况下,开启该参数。

dumponexit={true|false} JVM关闭时是否转储运行记录。如果启用且未输入文件名,则记录将写入进程启动目录中的文件。文件名称为系统生成的名称,包含进程ID、记录ID和当前时间戳,类似于hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr。缺省情况下,该参数为禁用状态。

duration=time 记录持续时间。附加s以指定以秒为单位的时间,m代表分钟,h代表小时,d代表天。例如,指定5h意味着5个小时。默认情况下,持续时间不受限制,该参数设置为0。

filename=path 停止记录时写入的文件路径和文件名。例如:

  • recording.jfr
  • /home/user/recordings/recording.jfr
  • c:\recordings\recording.jfr
    name=identifier 记录的名称和标识符。

maxage=time 指定要记录的磁盘数据的最大保存时间。当磁盘参数设置为“true”时,该参数有效。附加s以指定以秒为单位的时间,m代表分钟,h代表小时,d代表天。例如,指定30s意味着30秒。默认情况下,不限制最大年龄,该参数设置为0。

maxsize=size 用于记录的磁盘数据的最大大小(以字节为单位)。当磁盘参数设置为“true”时,该参数有效。该值不能小于通过-XX:FlightRecorderOptions设置的maxchunksize参数的值。附加m或M以指定大小(以兆字节为单位),附加g或G以指定大小(以千兆字节为单位)。默认情况下,不限制磁盘数据的最大大小,该参数设置为0。

path-to- GC -root ={true|false}是 否在记录结束时收集GC根路径。缺省情况下,该参数为禁用状态。

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

settings=path 事件设置文件(JFC类型)的路径和名称。缺省情况下,为default.jfc文件,位于JRE_HOME/lib/jfr。这个默认设置文件以低开销收集一组预定义的信息,因此它对性能的影响很小,可以用于连续运行的记录。

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

可以为多个参数指定值,参数之间用逗号分隔。

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

  • Linux: 1024 KB
  • macOS: 1024 KB
  • Windows:默认值取决于虚拟内存。
    下面的例子展示了如何以不同的单位将线程堆栈大小设置为1兆字节:
-XX:ThreadStackSize=1k
-XX:ThreadStackSize=1024

这个选项类似于-Xss。

-XX:-UseBiasedLocking 禁用偏差锁定。一些具有大量无争用同步的应用程序在启用此标志后可能获得显著的速度提升,但具有某些锁定模式的应用程序可能会看到速度变慢。

默认情况下,该选项是启用的。

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

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

-XX:-UseContainerSupport 虚拟机现在提供了自动容器检测支持,这允许虚拟机确定运行在docker容器中的Java进程可用的内存数量和处理器数量。它使用这个信息来分配系统资源。这种支持仅在Linux x64平台上可用。如果受支持,此标志的默认值为true,默认情况下启用容器支持。可以通过-XX:-UseContainerSupport禁用。

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

使用-Xlog:os+container=trace来最大限度地记录容器信息。有关使用统一日志的描述,请参见使用JVM统一日志框架启用日志。

-XX:+ usegclogroation 处理大的日志文件。该选项必须与-Xloggc:filename一起使用。

-XX:NumberOfGClogFiles=number_of_files 处理大的日志文件。number_of_files必须大于等于1。默认值是1。

-XX:GCLogFileSize=number 处理大的日志文件。数字可以是数字m或数字k的形式。默认设置为512K。

-XX:+UseHugeTLBFS 仅Linux:该选项等同于指定-XX:+UseLargePages。默认情况下,该选项是禁用的。这个选项在预留内存时预先分配所有大页面;因此,JVM不能动态地增加或缩小大页面的内存区域。请参阅-XX:UseTransparentHugePages,如果你想要这个行为。

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

-XX:+UseMembar 允许在线程状态转换时发出成员。这个选项默认在所有平台上禁用,除了ARM服务器,在ARM服务器上启用。(建议您不要在ARM服务器上禁用此选项。)

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

-XX:+UseTransparentHugePages 仅Linux:启用可以动态增长或收缩的大页面。默认情况下,该选项是禁用的。当操作系统移动其他页面来创建大页面时,您可能会遇到透明大页面的性能问题;这个选项可以用于实验。

-XX:+AllowUserSignalHandlers 允许应用程序安装信号处理器。默认情况下,这个选项是禁用的,应用程序不允许安装信号处理程序。

-XX:VMOptionsFile=filename 允许用户在文件中指定虚拟机选项,例如:

java -XX:VMOptionsFile=/var/my_vm_options HelloWorld

高级JIT编译器选项

这些java选项控制java HotSpot VM执行的动态JIT编译。

-XX:AllocateInstancePrefetchLines=lines设置在实例分配指针之前预取的行数。缺省情况下,预取行数为1:

-XX:AllocateInstancePrefetchLines=1

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

-XX:AllocateInstancePrefetchLines=1

只有Java HotSpot Server虚拟机支持该选项。

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

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

以设置预取距离为1024字节为例:

-XX:AllocatePrefetchDistance=1024

只有Java HotSpot Server虚拟机支持该选项。

-XX:AllocatePrefetchInstr=instruction 设置预取指令,在分配指针之前预取。只有Java HotSpot Server虚拟机支持该选项。可能的值从0到3。值后面的实际指令取决于平台。缺省情况下,预取指令为0:

-XX:AllocatePrefetchInstr=0

只有Java HotSpot Server虚拟机支持该选项。

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

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

-XX:AllocatePrefetchLines=5

只有Java HotSpot Server虚拟机支持该选项。

-XX:AllocatePrefetchStyle=style 设置预取指令生成的代码样式。style参数是一个从0到3的整数:

0不生成预取指令。

1每次分配后执行预取指令。这是默认参数。

2使用TLAB (thread-local allocation block)水印指针判断何时执行预取指令。

3在SPARC上使用BIS指令进行分配预取。

只有Java HotSpot Server虚拟机支持该选项。

-XX:+BackgroundCompilation 启用后台编译。该选项在默认情况下是启用的。要禁用后台编译,请指定-XX:-BackgroundCompilation(这相当于指定-Xbatch)。

-XX:CICompilerCount=threads 设置用于编译的编译器线程数。默认情况下,服务器JVM的线程数设置为2,客户端JVM的线程数设置为1,如果使用分层编译,线程数将根据内核数进行扩展。下面的示例演示如何将线程数设置为2:

-XX:CICompilerCount=2

-XX:CompileCommand=command,method[,option]指定要在方法上执行的命令。例如,要使String类的indexOf()方法不被编译,可以使用以下方法:

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

如果指定的方法没有签名,则该命令将应用于所有具有指定名称的方法。但是,您也可以在类文件格式中指定方法的签名。在这种情况下,您应该将参数用引号括起来,否则shell将分号视为命令结束。例如,如果你想只排除String类的indexOf(String)方法不被编译,可以使用以下方法:

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

高级的可服务性选项

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

-XX:+ExtendedDTraceProbes Linux和macOS:启用额外的影响性能的dtrace工具探测。默认情况下,这个选项是禁用的,dtrace只执行标准探测。

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

高级垃圾回收选项

这些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:+ cmsscavengebeforermark 启用CMS标记步骤之前的清除尝试。默认情况下,该选项是禁用的。

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

设置占用率为75%的示例如下:

-XX:CMSTriggerRatio=75

-XX:ConcGCThreads=threads 设置并发GC使用的线程数。将线程设置为并行垃圾收集线程数的大约1/4。默认值取决于JVM可用的cpu数量。

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

-XX:ConcGCThreads=2

-XX:+DisableExplicitGC 启用该选项,禁用对System.gc()方法调用的处理。该选项在默认情况下是禁用的,这意味着对System.gc()的调用将被处理。如果禁用了对System.gc()的处理调用,那么JVM在必要时仍然执行GC。

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

-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 支持通过使用System.gc()请求调用并发GC,并在并发GC周期中卸载类。该选项在默认情况下是禁用的,只能通过已弃用的-XX:+UseConcMarkSweepGC选项启用。

-XX:G1HeapRegionSize=size 当使用垃圾优先(G1)收集器时,设置Java堆细分到的区域的大小。该值是2的幂,范围从1 MB到32 MB。目标是基于最小的Java堆大小拥有大约2048个区域。默认区域大小是根据堆大小从人体工程学角度确定的。

下面的示例设置子分区的大小为16mb:

-XX:G1HeapRegionSize=16m

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

-XX:G1MaxNewSizePercent=percent 设置要使用的堆大小的百分比作为年轻代大小的最大值。默认值是Java堆的60%。

这是一个经验性的开关。该设置将替换-XX:DefaultMaxNewGenPercent设置。

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

-XX:G1MixedGCCountTarget=number 设置标记周期后的混合垃圾收集的目标数量,以收集最多G1MixedGCLIveThresholdPercent活动数据的旧区域。默认是8个混合垃圾收集。混合集合的目标是在这个目标数量之内。

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

-XX:G1MixedGCLiveThresholdPercent=percent 设置旧区域被包含在混合垃圾收集循环中的占用阈值。默认的入住率是85%。

这是一个经验性的开关。此设置替换-XX:G1OldCSetRegionLiveThresholdPercent设置。

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

-XX:G1NewSizePercent=percent设置要使用的堆的百分比作为年轻代大小的最小值。默认值是Java堆的5%。

这是一个经验性的开关。该设置将替换-XX:DefaultMinNewGenPercent设置。

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

-XX:G1OldCSetRegionThresholdPercent=percent设置混合垃圾收集周期中要收集的旧区域数量的上限。默认值是Java堆的10%。

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

-XX:G1ReservePercent=percent 设置保留为假上限的堆的百分比(0到50),以减少G1收集器提升失败的可能性。当您增加或减少这个百分比时,请确保以相同的幅度调整Java堆总量。默认情况下,该选项设置为10%。

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

-XX:G1ReservePercent=20

-XX:InitialHeapOccupancyPercent=percent 设置触发标记周期的Java堆占用阈值。默认的占用率是整个Java堆的45%。

-XX:InitialHeapSize=size 设置内存分配池的初始大小(字节)。该值必须为0或1024的倍数,且大于1mb。k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。默认值是在运行时根据系统配置选择的。

下面的例子展示了如何使用不同的单位将分配的内存大小设置为6mb:

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

如果将这个选项设置为0,那么初始大小将被设置为为老一代和年轻一代分配的大小的总和。年轻代的堆大小可以使用-XX:NewSize选项设置。

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

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

S=Y/(R+2)

方程中的2表示两个幸存者空间。指定为初始幸存者空间比率的值越大,初始幸存者空间大小就越小。

默认情况下,初始幸存者空间比设置为8。如果使用年轻代空间的默认值(2mb),那么幸存者空间的初始大小为0.2 MB。

设置初始幸存者空间比为4的示例如下:

-XX:InitialSurvivorRatio=4

-XX:InitiatingHeapOccupancyPercent=percent 设置堆占用的百分比(0到100),以启动并发GC周期。垃圾收集器使用它,它根据整个堆的占用率触发并发GC周期,而不仅仅是一个代(例如,G1垃圾收集器)。

缺省情况下,初始值为45%。值0表示不间断的GC周期。下面的示例演示如何将初始化堆占用率设置为75%:

-XX:InitiatingHeapOccupancyPercent=75

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

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

-XX:MaxGCPauseMillis=500

-XX:MaxHeapSize=size 设置内存分配池的最大大小。k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。根据系统配置,在运行时选择默认值。对于服务器部署,选项-XX:InitialHeapSize和-XX:MaxHeapSize通常设置为相同的值。

下面的例子展示了如何使用不同的单位将最大允许分配的内存大小设置为80mb:

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

-XX:MaxHeapSize 选项等价于-Xmx。

-XX:MaxHeapFreeRatio=percent 设置GC事件后允许的最大空闲堆空间百分比(0到100)。如果空闲堆空间超出这个值,那么堆就会收缩。默认情况下,这个值设置为70%。

通过命令行选项-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio降低参数MaxHeapFreeRatio(默认值为70%)和MinHeapFreeRatio(默认值为40%)的值来最小化Java堆大小。将MaxHeapFreeRatio降低到10%,将MinHeapFreeRatio降低到5%,成功地减少了堆大小,而没有太多的性能回归;然而,根据您的申请,结果可能会有很大的不同。对这些参数尝试不同的值,直到它们尽可能低,但仍然保持可接受的性能。

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

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

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

-XX:NewRatio=1

-XX:NewSize=size 设置年轻代(托儿所)堆的初始大小(以字节为单位)。加上字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。

堆的年轻代区域用于新对象。与其他区域相比,该区域执行GC的频率更高。如果年轻代的大小太低,那么将执行大量的minor gc。如果大小太高,则只执行完整的gc,这可能需要很长时间才能完成。Oracle建议将年轻代的大小保持在总体堆大小的25%和50%以下。

以下示例演示如何使用不同的单位设置年轻代的初始大小为256mb:

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

-XX:NewSize 选项等价于-Xmn。

-XX:ParallelGCThreads=threads 设置停止世界(STW)工作线程的值。这个选项将线程的值设置为逻辑处理器的数量。线程的值与8以内的逻辑处理器的数量相同。

如果有超过8个逻辑处理器,那么这个选项将线程的值设置为大约5/8个逻辑处理器。除了更大的SPARC系统外,这种方法在大多数情况下都可以工作,在这种系统中,线程的值大约是逻辑处理器的5/16。

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

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

-XX:ParallelGCThreads=2

-XX:+ParallelRefProcEnabled 启用并行引用处理。默认情况下,该选项是禁用的。

-XX:+PrintAdaptiveSizePolicy 允许打印自适应生成大小的信息。默认情况下,该选项是禁用的。

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

-XX:-ShrinkHeapInSteps 递增地减少Java堆到目标大小,通过选项-XX: MaxHeapFreeRatio指定。该选项在默认情况下是启用的。如果禁用,那么它将立即将Java堆减少到目标大小,而不需要多个垃圾收集周期。如果希望最小化Java堆大小,请禁用此选项。当禁用此选项时,您可能会遇到性能下降的情况。

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

-XX:StringDeduplicationAgeThreshold=threshold 用于标识达到指定年龄的被认为是重复数据删除候选对象的字符串对象。对象的年龄是它在垃圾收集中存活的次数的度量。这有时被称为终身职位。请参阅已弃用的-XX:+PrintTenuringDistribution选项。

-XX:SurvivorRatio=ratio 设置eden 空间大小和幸存者空间大小之间的比例。默认情况下,该选项设置为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大小为512kb的示例如下:

-XX:TLABSize=512k

-XX:+UseAdaptiveSizePolicy 启用自适应生成大小调整。该选项在默认情况下是启用的。要禁用自适应生成大小,请指定-XX:-UseAdaptiveSizePolicy并显式设置内存分配池的大小。参见-XX:SurvivorRatio选项。

-XX:+ usecmsinitiatingooccupancyonly 启用占用值作为启动CMS收集器的唯一标准。默认情况下,该选项是禁用的,可以使用其他条件。

-XX:+UseG1GC 启用G1垃圾收集器。它是一种服务器风格的垃圾收集器,目标是具有大量RAM的多处理器机器。此选项在保持良好吞吐量的同时,很有可能满足GC暂停时间目标。对于需要大堆(大小约为6gb或更大)且GC延迟需求有限(稳定且可预测的暂停时间低于0.5秒)的应用程序,推荐使用G1收集器。默认情况下,这个选项是启用的,G1被用作默认的垃圾收集器。

-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:+UseSerialGC 启用串行垃圾回收器。对于不需要任何垃圾收集特殊功能的小型简单应用程序来说,这通常是最佳选择。默认情况下,此选项是禁用的,并且根据机器的配置和JVM的类型自动选择收集器。

-XX:+UseSHM 仅Linux:允许JVM使用共享内存来设置大页面。

有关设置大页面,请参阅大页面。

-XX:+UseStringDeduplication 启用字符串重删。默认情况下,该选项是禁用的。要使用此选项,必须启用垃圾优先(G1)垃圾收集器。

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

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

-XX:+UseZGC 启用Z垃圾收集器(ZGC)。这是一个低延迟垃圾收集器,以一定的吞吐量成本提供几毫秒的最大暂停时间。暂停时间与使用的堆大小无关。支持堆大小从8MB到16TB。

-XX:ZAllocationSpikeTolerance=factor 设置ZGC的分配穗容限。默认情况下,该选项被设置为2.0。这个因素描述了预期的分配峰值水平。例如,使用系数3.0意味着当前的分配率在任何时候都可以预期为原来的三倍。

-XX:ZCollectionInterval=seconds 使用ZGC时,设置两个GC周期之间的最大间隔(秒)。默认情况下,该选项被设置为0(禁用)。

-XX:ZFragmentationLimit=percent 设置ZGC的最大可接受堆碎片(以百分比为单位)。默认情况下,该选项设置为25。使用较低的值将导致更积极地压缩堆,以使用更多CPU时间为代价回收更多内存。

-XX:+ZProactive 在使用ZGC时启用主动GC周期。默认情况下,该选项是启用的。如果预期这样做对正在运行的应用程序的影响最小,ZGC将启动一个主动的GC周期。如果应用程序大部分是空闲的或分配很少的对象,但您仍然希望保持堆大小较小,并且即使堆上有很多空闲空间,也允许进行引用处理,那么这是非常有用的。

-XX:+ZUncommit 当使用ZGC时启用未使用的堆内存的未提交。默认情况下,该选项是启用的。未提交未使用的堆内存将降低JVM的内存占用,并使这些内存可供其他进程使用。

-XX:ZUncommitDelay=seconds 设置堆内存在未提交之前必须被使用的时间(以秒为单位)。默认情况下,该选项设置为300(5分钟)。提交和未提交内存是相对昂贵的操作。使用较低的值将导致堆内存更早未提交,有可能很快就不得不再次提交它。

命令行参数文件

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

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

java启动程序展开参数文件内容,直到遇到–disable-@files选项。您可以在命令行中的任何地方使用–disable-@files选项,包括在参数文件中,以停止@参数文件的扩展。

以下内容描述了java参数文件的语法:

  • 参数文件必须只包含ASCII字符或系统默认编码的ASCII友好字符,如UTF-8。
  • 参数文件大小不能超过MAXINT(2,147,483,647)字节。
  • 启动器不会展开参数文件中存在的通配符。
  • 使用空格或换行符分隔文件中包含的参数。
  • 空白包括空白字符,\t, \n, \r和\f。例如,可以有一个带空格的路径,比如c:\Program Files,可以指定为“c:\Program Files”或者为了避免转义,指定为c:\Program" "Files。
  • 任何包含空格的选项,比如路径组件,都必须使用引号(’"’)来包含全部字符。
  • 双引号内的字符串可以包含字符\n、\r、\t和\f。它们被转换成各自的ASCII码。
  • 如果文件名包含嵌入的空格,则将整个文件名放在双引号中。
  • 参数文件中的文件名相对于当前目录,而不是参数文件的位置。
  • 在参数文件中使用数字符号#来标识注释。#后面的所有字符将被忽略,直到行尾。
  • 附加@符号前缀到@前缀选项作为转义,(第一个@被删除,其余参数按原样呈现给启动器)。
  • 行可以在行尾使用延续字符()继续。将两行连接起来,并修剪前导空白。为了防止删除前导空格,可以在第一列放置一个延续字符()。
  • 因为反斜杠()是转义字符,反斜杠字符必须用另一个反斜杠字符转义。
  • 允许部分引用,并以文件结束符关闭。
  • 开引号在行结束时停止,除非\是最后一个字符,然后它通过删除所有前导空白字符来连接下一行。
  • 这些列表中不允许使用通配符()(比如指定.java)。
  • 不支持使用@符号(@)来递归解释文件。

参数文件中打开或部分引用的示例:

在参数文件中,

-cp "lib/
cool/
app/
jars

这被解释为:

-cp lib/cool/app/jars

参数文件中反斜杠字符转义与另一个反斜杠字符的示例

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

反斜杠字符必须在参数文件中指定为:

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

使用EOL转义强制参数文件中的行连接的示例

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

这被解释为:

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

参数文件中带前导空格的行继续示例

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

这被解释为:

-cp /lib/cool app/jars

你可以使用一个单独的参数文件,例如下面例子中的myargumentfile,来保存所有需要的java参数:

java @myargumentfile

你可以在参数文件中包含相对路径;但是,它们是相对于当前工作目录的,而不是参数文件本身的路径。在下面的示例中,path1/options和path2/options表示具有不同路径的参数文件。它们包含的任何相对路径都是相对于当前工作目录而不是参数文件的:

java @path1/options @path2/classes

代码堆状态分析

概述

有时候,了解JVM代码堆的当前状态有助于回答以下问题:

为什么JIT被关闭,然后又一次地打开?
所有的代码堆空间都到哪里去了?
为什么清扫器没有有效的工作?
为了提供这种洞察力,我们实现了一个代码堆状态分析特性,它支持对代码堆进行实时分析。分析过程分为两部分。第一部分检查整个代码堆并聚合所有被认为有用或重要的信息。第二部分包括几个独立的步骤,打印收集的信息,重点放在数据的不同方面。数据收集和打印是在“要求”的基础上完成的。

语法

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

jcmd pid Compiler.CodeHeap_Analytics[function] [granularity]

-Xlog:codecache=Trace 如果您只对运行样例工作负载后的代码堆外观感兴趣,可以使用命令行选项。

-Xlog:codecache=Debug 要查看“codecache满”条件下的代码堆状态,使用命令行选项启动虚拟机。

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

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

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

what 指定标签和级别的组合,形式为tag1[+tag2…][][=level][,…]。除非指定了通配符(),否则只有与指定的标记完全匹配的日志消息才被匹配。参见-Xlog标签和级别。

output 设置输出类型。缺省输出类型默认为stdout。看到-Xlog Output。

decorators 配置输出以使用自定义的装饰器集。缺省装饰器默认为正常运行时间、级别和标记。看装饰。

output-options 设置-Xlog日志输出选项。

描述

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

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

-Xlog 在info 级别启用JVM日志记录。

-Xlog:help 打印-Xlog使用语法和可用的标记、级别和装饰符,以及带有解释的示例命令行。

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

-Xlog[:option] 按在命令行上出现的顺序应用多个参数。相同输出的多个-Xlog参数以其给定的顺序相互覆盖。

该选项设置为:

[tag-selection][:[output][:[decorators][:output-options]]]

缺省 tag-selection默认为所有标记集和info级别。

tag[+…] all

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

输出选项是filecount=file-count filesize=file-size,带有可选的K, M或G后缀

默认配置

当-Xlog选项在命令行中未指定其他选项时,将使用默认配置。默认配置使用匹配警告或错误的级别记录所有消息,而不管消息与什么标记相关联。默认配置相当于在命令行中输入以下命令:

-Xlog:all=warning:stdout:uptime,level,tags
在运行时控制日志记录

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

-Xlog 标签和级别
每个日志消息都有一个级别和与之相关联的标记集。消息的级别对应于它的详细信息,标记集对应于消息包含的内容或它涉及的JVM组件(例如,gc、jit或os)。将GC标记映射到Xlog配置,请参见将GC日志标记转换为Xlog。

可用的日志级别:

  • off
  • trace
  • debug
  • info
  • warning
  • error
    可用的日志标记:

实际上有几十个日志标记,它们在正确的组合中可以支持一定范围的日志输出。可以使用-Xlog:help查看完整的可用日志标记集。指定all而不是标记组合将匹配所有标记组合。

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

  • stdout - 发送输出到stdout
  • stderr - 发送输出到stderr
  • file=filename -发送输出到文本文件。

当使用file=filename时,在文件名中指定%p和/或%t将分别扩展为JVM的PID和启动时间戳。您还可以配置文本文件来处理基于文件大小和要旋转的文件数量的文件旋转。例如,要将日志文件每10 MB旋转一次,并保持5个文件的旋转,指定选项filesize=10M, filecount=5。文件的目标大小不能保证是精确的,它只是一个近似值。默认情况下,文件最多可旋转5个目标大小为20mb的文件,除非另有配置。指定filecount=0意味着日志文件不应该被旋转。存在覆盖已存在日志文件的可能性。

装饰

日志消息用有关消息的信息来修饰。您可以配置每个输出,以使用自定义的装饰器集。输出的顺序始终与表中列出的相同。您可以配置在运行时使用的装饰。在日志消息前添加修饰。例如:

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

缺省装饰器默认为正常运行时间、级别和标记。无装饰器是特殊的,用来关闭所有的装饰。

Time (t)、utctime (utc)、uptime (u)、timemillis ™、uptimemillis (um)、timenanos (tn)、uptimenanos (un)、hostname (hn)、pid §、tid (ti)、level (l)、tags (tg)装饰器也可以指定为none,表示没有装饰。

Decorations 描述time or 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 -与日志消息相关联的级别。tag或tg -与日志消息相关联的标记集。

-Xlog 用法示例
下面是-Xlog示例。

-Xlog 使用info级别记录所有消息,包括正常运行时间、级别和标记装饰。这相当于使用:

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

-Xlog:gc 使用info级别到标准输出记录带有gc标记的消息。所有其他警告级别的消息的默认配置生效。

-Xlog:gc,safepoint 将带有gc或safepoint标记(都使用info级别)的消息记录到标准输出,带有默认的修饰。同时带有gc和safepoint标记的消息将不会被记录。

-Xlog:gc+ref=debug记录带有gc和ref标记的消息,使用标准输出的调试级别,带有默认的修饰。只标记两个标记中的一个的消息将不会被记录。

-Xlog:gc=debug:file=gc.txt:none使用调试级别将带有gc标记的消息记录到一个名为gc.txt的文件中,不加任何修饰。所有其他警告级别的消息的默认配置仍然有效。

-Xlog:gc=trace:file=gctrace.txt:uptimemillis,pid:filecount=5,filesize=1024使用跟踪级别将带有gc标记的消息记录到一个旋转文件集,该文件集包含5个文件,大小为1 MB,基本名称为gctrace.txt,并使用装饰uptimemillis和pid。

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

-Xlog:gc::uptime,tid 使用默认的’info’级别记录带有gc标记的消息,以默认输出标准输出,并使用装饰的uptime和tid。所有其他警告级别的消息的默认配置仍然有效。

-Xlog:gc*=info,safepoint*=off 使用info级别记录至少以gc标记的消息,但关闭以safepoint标记的消息的日志记录。同时带有gc和safepoint标记的消息将不会被记录。

-Xlog:disable -Xlog: safepointtrace =trace:safepointtrace.txt关闭所有日志记录,包括警告和错误,然后使用对文件safepointtrace.txt的跟踪级别启用带有safepoint标记的消息。默认配置不适用,因为命令行以-Xlog:disable开始。

复杂-Xlog用法示例

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

-Xlog:gc+class*=debug使用标准输出的调试级别记录至少带有gc和class标记的消息。所有其他警告级别的消息的默认配置仍然有效

-Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt使用文件gcmetatrace.txt的跟踪级别记录至少带有gc和meta标记的消息,但关闭所有带有class标记的消息。带有gc、meta和class标记的消息不会被记录,因为class*被设置为关闭。警告级别的所有其他消息的默认配置都有效,除了那些包括class的消息。

-Xlog:gc+meta=trace使用到标准输出的跟踪级别精确地标记为gc和meta标记的消息。所有其他警告级别的消息的默认配置仍然有效。

-Xlog:gc+class+heap*=debug,meta*=warning,threads*=off 使用跟踪级别到标准输出记录至少带有gc, class和堆标记的消息,但只记录带有meta with level标记的消息。除了那些包含线程的消息外,所有其他警告级别的消息的默认配置都是有效的。

验证Java虚拟机标志参数

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

无论它们是在命令行中、通过输入工具设置的,还是通过api(例如,包Java .lang.management中包含的类),提供给所有Java虚拟机(JVM)命令行标志的值都会被验证。人机工程学在Java平台,标准版热点虚拟机垃圾收集调优指南中进行了描述。

如果在JVM初始化期间设置了所有标志的值,或者在运行时更改了标志的值(例如使用jcmd工具),那么就会验证范围和约束。如果某个值违反范围检查或约束检查,则JVM将终止,并在错误流上打印适当的错误消息。

例如,如果一个标志违反了范围或约束检查,那么JVM就会退出并返回一个错误:

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

标志-XX:+PrintFlagsRanges打印所有标志的范围。该标志允许通过范围提供的值自动测试标志。对于指定了范围的标志,将在输出中打印类型、名称和实际范围。

例如,

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

对于没有指定范围的标志,其值不会显示在打印输出中。例如:

size_t NewSize         [   ...                  ] {product}

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

大页面

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

translation - lookaside Buffer (TLB)是一种页面转换缓存,它保存最近使用的虚拟到物理的地址转换。TLB是一种稀缺的系统资源。TLB miss的代价可能很高,因为处理器随后必须从分层页表中读取数据,这可能需要多次内存访问。通过使用更大的内存页大小,单个TLB条目可以表示更大的内存范围。这将减少TLB上的压力,并且内存密集型应用程序可能具有更好的性能。

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

Linux和Windows支持大页面。

支持Linux的大页面

2.6内核支持大页面。一些供应商已经将代码反向移植到他们基于2.4的版本中。要检查您的系统是否支持大页内存,请尝试以下步骤:

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

如果输出显示了三个“Huge”变量,那么您的系统可以支持大页面内存,但需要对其进行配置。如果命令什么也不打印,那么您的系统不支持大页面。要配置系统使用大页内存,请以root用户身份登录,然后按照以下步骤操作:

  • 如果您正在使用选项-XX:+UseSHM(而不是-XX:+UseHugeTLBFS),那么增加SHMMAX值。它必须大于Java堆大小。在一个有4 GB物理RAM(或更少)的系统上,以下方法使所有内存都是可共享的:
  • echo 4294967295 > /proc/sys/kernel/shmmax
  • 如果您正在使用选项-XX:+UseSHM或-XX:+UseHugeTLBFS,则指定大页面的数量。在以下示例中,4gb系统中的3gb预留给大页面(假设大页面大小为2048kB,那么3gb = 3 * 1024 MB = 3072 MB = 3072 * 1024 kB = 3145728 kB和3145728 kB / 2048kB = 1536):
  • echo 1536 > /proc/sys/vm/nr_hugepages 注意:在重新启动系统后,/proc中包含的值将重置,因此可能需要在初始化脚本中设置它们(例如rc。本地或sysctl.conf)。
  • 如果配置(或调整)OS内核参数/proc/sys/kernel/shmmax或/proc/sys/vm/nr_hugepages, Java进程可能会为Java堆之外的区域分配大页。这些步骤可以为以下区域分配大页面:
    。 Java堆
    。 代码缓存
    。 用于并行GC的标记位图数据结构
支持Windows的大页面

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

  • 选择“控制面板”、“管理工具”,然后选择“本地安全策略”。
  • 选择“本地策略”,然后选择“用户权限分配”。
  • 双击“锁定内存中的页面”,然后添加用户和/或组。
  • 重新启动您的系统。
    注意,即使是运行应用程序的管理员也需要这些步骤,因为管理员默认情况下没有在内存中锁定页面的权限。

应用程序类数据共享

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

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

  • 运行时映像中的平台类
  • 运行时映像中的应用程序类
  • 类路径中的应用程序类
  • 模块路径中的应用程序类
    归档应用程序类提供了更好的运行时启动时间。当运行多个JVM进程时,AppCDS还通过为只读元数据共享内存减少了运行时占用的空间。

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

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

  • 对于基本CDS,非空目录不能存在于-Xbootclasspath/a路径中
  • 使用-XX:+UseAppCDS,在-Xbootclasspath/a路径、类路径和模块路径中不能存在非空目录。
    在JDK 11及更高版本中,-XX:+UseAppCDS已经过时,非空目录的行为基于类列表中的类类型。在以下情况下,非空目录将被报告为致命错误:
  • 如果没有加载应用程序类或平台类,dump time仅在-Xbootclasspath/a路径中存在非空目录时报告错误
  • 如果加载了应用程序类或平台类,dump time会报告存在于-Xbootclasspath/a路径、类路径或模块路径中的非空目录的错误
    在JDK 11及更高版本中,使用-XX:DumpLoadedClassList=class_list_file会生成一个包含所有类(包括系统库类和应用程序类)的类列表。您不再需要使用-XX:DumpLoadedClassList指定-XX:+UseAppCDS来生成一个完整的类列表。

在JDK 11及后续版本中,由于UseAppCDS已经过时,SharedArchiveFile默认成为产品标志。在任何配置中都不再需要为SharedArchiveFile指定+UnlockDiagnosticVMOptions。

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

Preload Warning: Cannot find array_name

尽管不允许在类列表中创建数组,但仍然可以在CDS/AppCDS转储时创建一些数组类。这些数组是在Java类加载器(PlatformClassLoader和系统类加载器)用于在转储时加载类的Java代码执行期间创建的。创建的数组与装入的其他类一起存档。

扩展类数据共享以支持模块路径
类数据共享(CDS)得到了改进,以支持从模块路径归档类。

  • 要使用–module-path VM选项创建CDS存档,请使用以下命令行语法:
    java -Xshare:dump -XX:SharedClassListFile=class_list_file -XX:SharedArchiveFile=shared_archive_file --module-path=path_to_modular_jar -m module_name
  • 要使用–module-path VM选项运行CDS存档,请使用以下命令行语法:
    java -XX:SharedArchiveFile=shared_archive_file --module-path=path_to_modular_jar -m module_name 下表描述了与模块路径相关的VM选项如何与-Xshare选项一起使用:
  • windos java war命令 javaw命令是什么意思_jvm.gc

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

2 可以在转储时间和运行时间指定不同的mp。如果一个存档的类K在转储时从mp1.jar中加载,但是mp中的变化导致它在运行时从另一个mp2.jar中可用,那么K的存档版本在运行时将被忽略;K将被动态加载。

3 目前只有两个系统模块可以升级(java.compiler和jdk.internal.vm.compiler)。然而,这些模块很少在生产软件中升级。

在JEP 261中,强烈建议在生产中使用–patch-module。

限制模块用于测试目的。它很少在生产软件中使用。

如果在转储时指定了–upgrade-module-path、–patch-module或–limit-modules,将打印一个错误并退出JVM。例如,如果在转储时指定了–limit-modules选项,用户将看到以下错误:

Error occurred during initialization of VM
Cannot use the following option when dumping the shared archive: --limit-modules

如果在运行时指定了–upgrade-module-path、–patch-module或–limit-modules,则会打印一条警告消息,指示CDS被禁用。例如,如果在运行时指定了–limit-modules选项,用户将看到以下警告:

Java HotSpot(TM) 64-Bit Server VM warning: CDS is disabled when the --limit-modules option is specified.

性能调优示例

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

优化更高的吞吐量

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

java -server -XX:+UseParallelGC -XX:+UseLargePages -Xmn10g  -Xms26g -Xmx26g
优化更低的响应时间

使用以下命令和高级选项来降低应用程序的响应时间:

java -XX:+UseG1GC -XX:MaxGCPauseMillis=100
保持Java堆小,减少嵌入式应用程序的动态占用

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

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

注意:这两个选项的默认值分别是70%和40%。由于在使用这些小设置时可能会出现性能牺牲,因此应该通过尽可能减少这些设置来优化,以减少占用空间,同时不引入不可接受的性能降低。

退出状态

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

0: Successful completion
>0: An error occurred