JVM的命令行参数

启动Java应用程序。

一、概要

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

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

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

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

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

对于需要参数的选项,参数可以用空格、冒号(:)或等号(=)与选项名称分开,或者参数可以直接跟在选项后面(每个选项的确切语法不同)。
如果预计指定字节大小,你可以使用任何后缀,或者使用后缀kK千字节(KB),mM兆字节(MB)gG千兆字节(GB)。例如,设置大小为8GB,可以指定8g8192m8388608k,或8589934592作为参数。
如果希望指定百分比,请使用0到1之间的数字(例如,指定0.25为25%)。
如果指定时间,可以使用后缀s秒、m分钟、h小时或d天为单位指定时间。

二、标准选项

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

-agentlib:libname[=options]

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

如果-agentlib:foo指定了该选项,则JVM会尝试加载libfoo.soLD_LIBRARY_PATH系统变量指定的位置中命名的库(在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。

-Dproperty=value

设置系统属性值。该属性变量是没有空格表示属性的名称的字符串。变量是表示属性的值的字符串。如果value是带空格的字符串,则将其括在引号中(例如-Dfoo="foo bar")。
-d32在32位环境中运行应用程序。如果没有安装或不支持32位环境,则会报错。默认情况下,应用程序在32位环境中运行,除非使用64位系统。
-d64在64位环境中运行应用程序。如果未安装或不支持64位环境,则会报错。默认情况下,应用程序在32位环境中运行,除非使用64位系统。
目前只有Java HotSpot Server VM支持64位操作,并且该-server选项在使用-d64.-client使用时忽略该选项-d64。这在未来的版本中可能会发生变化。

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

禁用断言。默认情况下,断言在所有包和类中都是禁用的。
没有参数,-disableassertions(-da)禁用所有包和类中的断言。当packagename参数以结尾时...,该开关会禁用指定包和任何子包中的断言。如果参数只是...,则开关禁用当前工作目录中未命名包中的断言。使用classname参数,开关禁用指定类中的断言。
-disableassertions-da)选项适用于所有的类加载器和系统类(其中没有一个类加载器)。此规则有一个例外:如果提供的选项没有参数,则它不适用于系统类。这使得在除系统类之外的所有类中禁用断言变得容易。该-disablesystemassertions选项使您能够禁用所有系统类中的断言。
要在特定包或类中显式启用断言,请使用-enableassertions(-ea)选项。这两个选项可以同时使用。例如,要运行MyClass在包com.wombat.fruitbat(和任何子包)中启用断言但在class中禁用的应用程序com.wombat.fruitbat.Brickbat,请使用以下命令:

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

-disablesystemassertions
-dsa

禁用所有系统类中的断言。

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

启用断言。默认情况下,断言在所有包和类中都是禁用的。

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

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

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

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

-enablesystemassertions
-esa

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

-help
-?

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

-jar filename

执行封装在JAR文件中的程序。该文件名参数是与包含在形成一条线的清单JAR文件的名称Main-Class: classname,定义与类public static void main(String[] args)充当应用程序的出发点法。
使用该-jar选项时,指定的JAR文件是所有用户类的来源,其他类路径设置将被忽略。

-javaagent: jarpath [=options]

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

-jre-restrict-search

在版本搜索中包括用户私有的JRE。

-no-jre-restrict-search

从版本搜索中排除用户专用JRE。

-server

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

-showversion

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

-splash:imgname

显示带有imgname指定图像的初始屏幕。例如,要在启动应用程序时显示目录中的splash.gif文件images,请使用以下选项:

-splash:images/splash.gif

-verbose:class

显示有关每个加载类的信息。

-verbose:gc

显示有关每个垃圾回收(GC)事件的信息。

-verbose:jni

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

-version

显示版本信息然后退出。该选项与该选项等效,-showversion只是后者在显示版本信息后不指示JVM退出。

-version:release

指定用于运行应用程序的发布版本。如果java调用的命令的版本不符合此规范并且在系统上找到了适当的实现,则将使用适当的实现。
例如,如果运行类或JAR文件需要JRE 6u13(1.6.0_13)或从6u10(1.6.0_10)开始的任何JRE 6,请指定以下内容:

-版本:“1.6.0_13 1.6* & 1.6.0_10+”

仅当release参数中有空格时才需要引号。
对于JAR文件,首选是在JAR文件清单中而不是在命令行中指定版本要求。


三、非标准选项

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

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

-Xmnsize

为年轻代(nursery)设置堆的初始和最大大小(以字节为单位)。
堆的年轻代区域用于新对象。GC在该区域执行的频率高于其他区域。如果年轻代的大小太小,则会执行很多次要的垃圾收集。如果大小太大,则只会执行完整的垃圾收集,这可能需要很长时间才能完成。Oracle建议您将年轻代的大小保持在整个堆大小的一半到四分之一之间。
下面的例子展示了如何使用不同的单位将年轻代的初始和最大大小设置为256MB:

-Xmn256m
-Xmn262144k
-Xmn268435456

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

-Xmssize

设置堆的最小值和初始大小(以字节为单位)。此值必须是1024的倍数且大于1MB。
以下示例显示如何使用各种单位将分配的内存大小设置为6MB:

-Xms6291456
-Xms6144k
-Xms6m

如果你不设置这个选项,那么初始大小将被设置为分配给老年代和年轻代的大小之和。年轻代堆的初始大小可以使用-Xmn选项或-XX:NewSize选项设置。
请注意,该-XX:InitialHeapSize选项还可用于设置初始堆大小。如果它出现在-Xms命令行之后,则初始堆大小将设置为指定的值-XX:Initialheapsize

-Xmxsize

设置内存分配池的最大大小(以字节为单位)。此值必须是1024的倍数且大于2MB。
默认值是在运行时根据系统配置选择的。对于服务器部署,-Xms-Xmx经常设置为相同的值。
以下示例显示如何使用各种单位将分配的内存的最大允许大小设置为80MB:

-Xmx83886080
-Xmx81920k
-Xmx80m

在Oracle Solaris 7和Oracle Solaris 8 SPARC平台上,此值的上限约为4,000MB减去开销量。在Oracle Solaris 2.6和x86平台上,上限约为2,000MB减去开销量。在Linux平台上,上限约为2,000MB减去开销量。
-Xmx选项等效于-XX:MaxHeapSize.

-Xsssize

设置线程堆栈大小(以字节为单位)。
默认值取决于平台:

  • Linux/ARM(32位):320KB
  • Linux/i386(32位):320KB
  • Linux/x64(64位):1024KB
  • OS X(64位):1024KB
  • Oracle Solaris/i386(32位):320KB
  • Oracle Solaris/x64(64位):1024KB

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

-Xss1m
-Xss1024k
-Xss1048576

此选项等效于-XX:ThreadStackSize.

-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编译代码的最大代码缓存大小(以字节为单位)。默认的最大代码缓存大小为240MB;如果您使用option禁用分层编译-XX:-TieredCompilation,则默认大小为48MB:

-Xmaxjitcodesize=240m

此选项等效于-XX:ReservedCodeCacheSize.

-Xmixed

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

-Xnoclassgc

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

-Xprof

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

-Xrs

减少JVM对操作系统信号的使用。
关闭挂钩通过在关闭时运行用户清理代码(例如关闭数据库连接)来有序关闭Java应用程序,即使JVM突然终止也是如此。
JVM捕获信号以实现意外终止的关闭挂钩。JVM使用SIGHUPSIGINTSIGTERM来启动关闭挂钩的运行。
JVM使用类似的机制来实现为调试目的转储线程堆栈的功能。JVM用于SIGQUIT执行线程转储。
嵌入JVM的应用程序经常需要捕获诸如SIGINT或之类的信号SIGTERM,这可能会导致对JVM信号处理程序的干扰。该-Xrs选项可用于解决此问题。当-Xrs被使用时,信号掩模SIGINTSIGTERMSIGHUP,和SIGQUIT不被JVM改变,并且没有安装这些信号信号处理程序。
指定有两个后果-Xrs

  • SIGQUIT线程转储不可用。
  • 用户代码负责导致关闭挂钩运行,例如,通过System.exit()在JVM终止时调用。

-Xshare:mode

设置班级数据共享(CDS)模式。此选项的可能模式参数包括以下内容:

auto:如果可能,请使用CDS。这是Java HotSpot 32位客户端VM的默认值。
on:需要使用CDS。如果无法使用类数据共享,则打印错误消息并退出。
off:不要使用CDS。这是Java HotSpot 32位服务器VM、Java HotSpot 64位客户端VM和Java HotSpot 64位服务器VM的默认值。
dump:手动生成CDS存档。

-XshowSettings:category

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

all:显示所有类别的设置。这是默认值。
locale:显示与区域设置相关的设置。
properties:显示与系统属性相关的设置。
vm:显示JVM的设置。

-Xusealtsigs
使用替代信号代替SIGUSR1SIGUSR2用于JVM内部信号。此选项等效于-XX:+UseAltSigs.

-Xverify:mode
设置字节码验证器的模式。字节码验证确保类文件的格式正确并满足第4.10节“Java虚拟机规范中class文件验证”中列出的约束。

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

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

remote:验证引导类加载器未加载的所有字节码。如果您未指定该-Xverify选项,则这是默认行为。
all:启用对所有字节码的验证。
none:禁用所有字节码的验证。-Xverify:none不支持使用。

四、高级运行时选项

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

-XX:ThreadStackSize=size

此选项等效于-Xss

-XX:+CheckEndorsedAndExtDirs

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

  • java.ext.dirsjava.endorsed.dirs系统属性设置。
  • lib/endorsed目录存在且不为空。
  • lib/ext目录包含除JDK之外的任何JAR文件。
  • 系统范围的特定于平台的扩展目录包含任何JAR文件。

-XX:+DisableAttachMechanism

启用禁用允许工具附加到JVM的机制的选项。默认情况下,该选项被禁用,这意味着连接机制启用,您可以使用工具,例如jcmdjstackjmap,和jinfo

-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 Flight Recorder(JFR)。这是一个商业功能,可与-XX:+UnlockCommercialFeatures选项结合使用,如下所示:

java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

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

-XX:-FlightRecorder

在应用程序运行时禁用Java Flight Recorder(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}:指定记录是连续的后台记录还是运行有限的时间。默认情况下,此参数设置为false(在有限时间内记录运行)。要使记录连续运行,请将参数设置为true

disk={true|false}:指定JFR是否应将连续记录写入磁盘。默认情况下,此参数设置为false(禁用连续记录到磁盘)。要启用它,请将参数设置为true,并设置defaultrecording=true

dumponexit={true|false}:指定当JVM以受控方式终止时是否应生成JFR数据的转储文件。默认情况下,此参数设置为false(不生成退出时的转储文件)。要启用它,请将参数设置为true,并设置defaultrecording=true。转储文件被写入dumponexitpath参数定义的位置。

dumponexitpath=path:指定转储文件的路径和名称,其中包含在JVM以受控方式退出时创建的JFR数据(如果您设置了该dumponexit=true参数)。仅当您还设置路径时,设置路径才有意义defaultrecording=true
如果指定的路径是目录,JVM会分配一个显示创建日期和时间的文件名。如果指定的路径包含文件名并且该文件已经存在,则JVM通过将日期和时间戳附加到指定的文件名来创建一个新文件。

globalbuffersize=size:指定用于数据保留的主内存总量(以字节为单位)。默认情况下,大小设置为462848字节。

loglevel={quiet|error|warning|info|debug|trace}:指定JFR写入日志文件的数据量。默认情况下,它设置为info

maxage=time:指定为默认记录保留的磁盘数据的最长时间。默认情况下,最长期限设置为15分钟(15m)。
只有设置了该disk=true参数才有效。

maxchunksize=size:指定记录中数据块的最大大小(以字节为单位)。默认情况下,数据块的最大大小设置为12MB。

maxsize=size:指定为默认记录保留的磁盘数据的最大大小(以字节为单位)。默认情况下,不限制磁盘数据的最大大小,该参数设置为0。
只有设置了该disk=true参数才有效。

repository=path:指定用于临时磁盘存储的存储库(目录)。默认情况下,使用系统的临时目录。

samplethreads={true|false}:指定是否启用线程采样。仅当与此参数一起启用采样事件时,才会发生线程采样。默认情况下,启用此参数。

settings=path:指定事件设置文件(JFC类型)的路径和名称。默认情况下,default.jfc使用位于JAVA_HOME/jre/lib/jfr.

stackdepth=depth:JFR堆栈跟踪的堆栈深度。默认情况下,深度设置为64次方法调用。最大值为2048,最小值为1。

threadbuffersize=size:指定每个线程的本地缓冲区大小(以字节为单位)。此参数的较高值允许更多数据收集而不会争用将其刷新到全局存储。它可以增加线程丰富的环境中的应用程序占用空间。默认情况下,本地缓冲区大小设置为5KB。

您可以通过用逗号分隔多个参数来指定多个参数的值。例如,要指示JFR将连续记录写入磁盘,并将数据块的最大大小设置为10MB,请指定以下内容:

-XX:FlightRecorderOptions=defaultrecording=true,disk=true,maxchunksize=10M

-XX:MaxDirectMemorySize=size

设置新I/O(java.nio包)直接缓冲区分配的最大总大小(以字节为单位)。默认情况下,大小设置为0,这意味着JVM会自动选择NIO直接缓冲区分配的大小。
以下示例说明如何以不同的单位将NIO大小设置为1024KB:

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

-XX:NativeMemoryTracking=mode

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

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

-XX:ObjectAlignmentInBytes=alignment

设置Java对象的内存对齐(以字节为单位)。默认情况下,该值设置为8个字节。指定的值应该是2的幂,并且必须在8到256(含)的范围内。此选项使使用具有大Java堆大小的压缩指针成为可能。
以字节为单位的堆大小限制计算如下:

\[4GB * ObjectAlignmentInBytes \]

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

-XX:OnError=string

设置一个自定义命令或一系列以分号分隔的命令,以便在发生不可恢复的错误时运行。如果字符串包含空格,则必须用引号将其括起来。
以下示例显示了如何使用该-XX:OnError选项运行gcore命令来创建核心映像,并在出现不可恢复的错误(%p指定当前进程)时启动调试器附加到进程:

-XX:OnError=gcore %p;dbx - %p

-XX:OnOutOfMemoryError=string

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

-XX:+PerfDataSaveToFile

如果启用,则在Java应用程序退出时保存jstat1个二进制数据。此二进制数据保存在名为的文件中hsperfdata_<pid>,其中<pid>是您运行的Java应用程序的进程标识符。使用jstat到如下显示包含在该文件中的性能数据:

jstat -class file:/// <path> /hsperfdata_ <pid>
jstat -gc file:/// <path> /hsperfdata_ <pid>

-XX:-PreferContainerQuotaForCPUCount

如果为true,则根据其CPU CFS(完全公平调度程序)配额(如果设置)的值计算容器CPU可用性。如果为false,则改用CPU份额值,前提是它小于CPU配额值。
如果您未使用该-XX:ActiveProcessorCount选项指定,VM将使用容器CPU可用性值来计算可用处理器的数量。
注意:CPU计数永远不会超过进程可用的活动处理器数。活动处理器可能已通过禁用它们或PrintContainerInfo为容器选择cpuset(CPU列表;请参阅选项)而受到限制。

-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 Usage:此进程使用的内存量,以字节为单位。
  • Maximum Memory Usage:此进程使用的最大内存量,以字节为单位。

-XX:+PrintNMTStatistics

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

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

-XX:+ResourceManagement

在应用程序运行时启用资源管理。
这是一项商业功能,需要您还指定-XX:+UnlockCommercialFeatures如下选项:

java -XX:+UnlockCommercialFeatures -XX:+ResourceManagement

-XX:ResourceManagementSampleInterval=value(毫秒)

设置控制资源管理测量的采样间隔的参数,以毫秒为单位。
只有在启用了资源管理(即-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应用程序启动时间和录制开始之间的延迟。默认情况下,没有延迟,该参数设置为0。

dumponexit={true|false}

指定当JVM以受控方式终止时是否应生成JFR数据的转储文件。默认情况下,此参数设置为false(不生成退出时的转储文件)。要启用它,请将参数设置为true
转储文件被写入filename参数定义的位置。

例子:

-XX:StartFlightRecording=name=test,filename=D:\test.jfr,dumponexit=true

duration=time
指定记录的持续时间。默认情况下,持续时间不受限制,该参数设置为0。

filename=path

指定JFR记录日志文件的路径和名称。

name=identifier

指定JFR记录的标识符。默认情况下,它设置为Recording x

maxage=time

指定为默认记录保留的磁盘数据的最长时间。默认情况下,最长期限设置为15分钟(15m)。

maxsize=size

指定为默认记录保留的磁盘数据的最大大小(以字节为单位)。默认情况下,不限制磁盘数据的最大大小,该参数设置为0。

settings=path

指定事件设置文件(JFC类型)的路径和名称。默认情况下,default.jfc使用位于JAVA_HOME/jre/lib/jfr.

您可以通过用逗号分隔多个参数来指定多个参数的值。例如,要将记录保存到当前工作目录中的test.jfr,并指示JFR压缩日志文件,请指定以下内容:

-XX:StartFlightRecording=filename=test.jfr,compress=true

-XX:+TraceClassLoading

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

-XX:+TraceClassLoadingPreorder

启用按引用顺序跟踪所有加载的类。默认情况下,此选项处于禁用状态并且不跟踪类。

-XX:+TraceClassResolution

启用对常量池分辨率的跟踪。默认情况下,此选项处于禁用状态,并且不会跟踪常量池解析。

-XX:+TraceClassUnloading

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

-XX:+TraceLoaderConstraints

启用对加载程序约束记录的跟踪。默认情况下,此选项处于禁用状态,并且不跟踪加载程序约束记录。

-XX:+UnlockCommercialFeatures

允许使用商业功能。默认情况下,此选项处于禁用状态,JVM在没有商业功能的情况下运行。一旦为JVM进程启用它们,就无法禁用它们在该进程中的使用。
如果未提供此选项,则仍可以使用适当的jcmd诊断命令在正在运行的JVM中解锁商业功能。

-XX:+UseAltSigs

使得能够使用替代信号,而不是SIGUSR1SIGUSR2用于JVM内部信号。默认情况下,此选项被禁用并且不使用替代信号。此选项等效于-Xusealtsigs.

-XX:+UseAppCDS

启用应用程序类数据共享(AppCDS)。要使用AppCDS,还必须指定选项的值-XX:SharedClassListFile-XX:SharedArchiveFile两个CDS在转储时间(见选项-Xshare:dump)和应用程序运行时间。
这是一项商业功能,需要您还指定-XX:+UnlockCommercialFeatures选项。这也是一个实验性功能;它可能会在未来的版本中改变。

-XX:-UseBiasedLocking

禁用偏向锁定。启用此标志的一些具有大量无竞争同步的应用程序可能会获得显着的加速,而具有某些锁定模式的应用程序可能会出现减速。默认情况下,启用此选项。

-XX:-UseCompressedOops

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

-XX:-UseContainerSupportVM

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

-XX:+UseMembar

允许在线程状态转换时发出membar。默认情况下,此选项在除ARM服务器之外的所有平台上都处于禁用状态,在这些平台上已启用。(建议您不要在ARM服务器上禁用此选项。)

-XX:+UsePerfData

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

-XX:+AllowUserSignalHandlers

允许应用程序安装信号处理程序。默认情况下,此选项处于禁用状态,并且不允许应用程序安装信号处理程序。

-XX:+UseHugeTLBFS

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

-XX:LargePageSizeInBytes=size

在Solaris上,设置用于Java堆的大页面的最大大小(以字节为单位)。的size参数必须是2的幂(2,4,8,16,...)。默认情况下,大小设置为0,这意味着JVM会自动为大页面选择大小。
以下示例说明了如何将大页面大小设置为4兆字节(MB):

-XX:LargePageSizeInBytes=4m

-XX:+UseLargePages

允许使用大页面内存。默认情况下,此选项被禁用并且不使用大页面内存。

-XX:+UseTransparentHugePages

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

五、高级JIT编译器选项

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

-XX:+AggressiveOpts

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

-XX:AllocateInstancePrefetchLines=lines

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

-XX:AllocateInstancePrefetchLines=1

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

-XX:AllocatePrefetchDistance=size

设置对象分配的预取距离的大小(以字节为单位)。即将用新对象的值写入的内存从最后分配的对象的地址开始预取到这个距离。每个Java线程都有自己的分配点。
负值表示根据平台选择预取距离。正值是要预取的字节。默认值设置为-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

设置顺序预取指令的步长(以字节为单位)。
默认情况下,步长设置为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

设置编译所需的最小可用空间(以字节为单位)。当剩余空间少于最小可用空间时,编译停止。
默认情况下,此选项设置为500KB。以下示例显示如何将最小可用空间设置为1024MB:

-XX:CodeCacheMinimumFreeSpace=1024m

-XX:CompileCommand=command, method, [option]

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

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

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

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

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

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

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

-XX:CompileCommand=exclude,*.indexOf

逗号和句点是空格的别名,可以更轻松地通过shell传递编译器命令。您可以通过-XX:CompileCommand将参数括在引号中来传递参数以使用空格作为分隔符:

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

请注意,在使用-XX:CompileCommand选项解析命令行上传递的命令后,JIT编译器然后从.hotspot_compiler文件中读取命令。您可以向该文件添加命令或使用该-XX:CompileCommandFile选项指定不同的文件。
要添加多个命令,请-XX:CompileCommand多次指定该选项,或者使用换行符(\n)分隔每个参数。以下命令可用:
休息调试JVM时设置断点在指定方法编译开始时停止。
只编译从编译中排除除指定方法之外的所有方法。作为替代方案,您可以使用该-XX:CompileOnly选项,该选项允许指定多种方法。在线防止内联指定的方法。排除从编译中排除指定的方法。帮助打印-XX:CompileCommand选项的帮助消息。排队尝试内联指定的方法。日志排除-XX:+LogCompilation指定方法以外的所有方法的编译日志记录(使用选项)。默认情况下,对所有编译的方法执行日志记录。选项此命令可用于将JIT编译选项传递给指定的方法,以代替最后一个参数(option)。编译选项设置在最后,方法名称之后。例如,要BlockLayoutByFrequency为类的append()方法启用选项StringBuffer,请使用以下命令:

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

您可以指定多个编译选项,以逗号或空格分隔。打印编译指定方法后打印生成的汇编代码。不要打印编译命令。默认情况下,XX:CompileCommand打印您使用-选项指定的命令;例如,如果从编译中排除类的indexOf()方法String,则以下内容将打印到标准输出:

CompilerOracle:exclude java/lang/String.indexOf

您可以通过-XX:CompileCommand=quiet在其他选项之前指定该选项来禁止此操作-XX:CompileCommand

-XX:CompileCommandFile=filename

设置从中读取JIT编译器命令的文件。默认情况下,该.hotspot_compiler文件用于存储JIT编译器执行的命令。
命令文件中的每一行代表一个命令、一个类名和一个使用该命令的方法名。例如,这一行打印toString()String类方法的汇编代码:

print java/lang/String toString

-XX:CompileOnly=method

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

-XX:CompileOnly=java/lang/String.length,java/util/List.size

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

-XX:CompileOnly=java.lang.String::length,java.util.List::size

尽管不支持通配符,但您可以仅指定类或包名称来编译该类或包中的所有方法,也可以仅指定编译任何类中具有此名称的方法的方法:

-XX:CompileOnly=java/lang/String
-XX:CompileOnly=java/lang
-XX:CompileOnly=.length

-XX:CompileThreshold=invocations

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

-XX:CompileThreshold=5000

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

-XX:+DoEscapeAnalysis

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

-XX:InitialCodeCacheSize=size

设置初始代码缓存大小(以字节为单位)。默认值设置为500KB。初始代码缓存大小应不小于系统的最小内存页大小。
以下示例显示了如何将初始代码缓存大小设置为32KB:

-XX:InitialCodeCacheSize=32k

-XX:+Inline

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

-XX:InlineSmallCode=size

设置应内联的已编译方法的最大代码大小(以字节为单位)。只有大小小于指定大小的已编译方法才会被内联。
默认情况下,最大代码大小设置为1000字节:

-XX:InlineSmallCode=1000

-XX:+日志编译启用将编译活动记录到hotspot.log在当前工作目录中命名的文件中。您可以使用该-XX:LogFile选项指定不同的日志文件路径和名称。
默认情况下,此选项处于禁用状态,并且不记录编译活动。该-XX:+LogCompilation选项必须与-XX:+UnlockDiagnosticVMOptions解锁诊断JVM选项的选项一起使用。
每次使用该-XX:+PrintCompilation选项编译方法时,您都可以启用详细诊断输出,并在控制台上打印一条消息。

-XX:MaxInlineSize=size

设置要内联的方法的最大字节码大小(以字节为单位)。默认情况下,最大字节码大小设置为35个字节:

-XX:MaxInlineSize=35

-XX:MaxNodeLimit=nodes

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

-XX:MaxNodeLimit=65000

-XX:MaxTrivialSize=size

设置要内联的普通方法的最大字节码大小(以字节为单位)。默认情况下,普通方法的最大字节码大小设置为6个字节:

-XX:MaxTrivialSize=6

-XX:+OptimizeStringConcat

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

-XX:+PrintAssembly

使用外部disassembler.so库启用字节编码和本机方法的汇编代码打印。这使您能够查看生成的代码,这可以帮助您诊断性能问题。
默认情况下,此选项被禁用并且不打印汇编代码。该-XX:+PrintAssembly选项必须与-XX:+UnlockDiagnosticVMOptions解锁诊断JVM选项的选项一起使用。

-XX:+PrintCompilation

编译通过在每次编译方法时将消息打印到控制台来启用来自JVM的详细诊断输出。这使您能够查看实际编译了哪些方法。默认情况下,此选项被禁用并且不打印诊断输出。
您还可以使用该-XX:+LogCompilation选项将编译活动记录到文件中。

-XX:+PrintInlining

启用内联决策的打印。这使您能够查看哪些方法正在被内联。
默认情况下,此选项被禁用并且不打印内联信息。该-XX:+PrintInlining选项必须与-XX:+UnlockDiagnosticVMOptions解锁诊断JVM选项的选项一起使用。

-XX:ReservedCodeCacheSize=size

设置JIT编译代码的最大代码缓存大小(以字节为单位)。默认的最大代码缓存大小为240MB;如果使用选项禁用分层编译-XX:-TieredCompilation,则默认大小为48MB。此选项的限制为2GB;否则会产生错误。最大代码缓存大小不应小于初始代码缓存大小;见选项-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

支持UseAES和UseAESIntrinsics标志为32位和64位使用-server选项来选择Java HotSpot服务器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服务器VM。
RTM是英特尔TSX的一部分,它是一种x86指令集扩展,有助于创建多线程应用程序。RTM引入了新的指示XBEGINXABORTXEND,和XTEST。该XBEGINXEND说明附上一组指令作为一个事务中运行。如果在运行事务时没有发现冲突,则在XEND指令处一起提交内存和寄存器修改。该XABORT指令可用于显式中止事务,并且该XEND指令可用于检查一组指令是否正在事务中运行。
当另一个线程试图访问同一个事务时,事务上的锁就会膨胀,从而阻塞最初没有请求访问该事务的线程。RTM要求指定一组回退操作,以防事务中止或失败。RTM锁是一种已委托给TSX系统的锁。
RTM提高了关键区域(即不能由多个线程同时访问的代码)中低冲突的高度竞争锁的性能。RTM还提高了粗粒度锁定的性能,这通常在多线程应用程序中表现不佳。(粗粒度锁定是长时间持有锁以最小化获取和释放锁的开销的策略,而细粒度锁定是通过仅在必要时锁定并尽快解锁来尝试实现最大并行度的策略。)另外,对于不同线程使用的轻度争用锁,RTM可以减少错误的缓存行共享,也称为缓存行乒乓。当来自不同处理器的多个线程访问不同的资源时会发生这种情况,但资源共享相同的缓存行。结果,处理器反复使其他处理器的缓存行无效,这迫使它们从主内存而不是从它们的缓存中读取。

-XX:+UseSHA

为SPARC硬件的SHA加密哈希函数启用基于硬件的内在函数。UseSHA与结合使用UseSHA1IntrinsicsUseSHA256IntrinsicsUseSHA512Intrinsics选项。
UseSHAUseSHA*Intrinsics标志默认情况下启用,并且仅适用于SPARC T4和新的Java HotSpot的服务器虚拟机的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

java.util.concurrentControl+C事件(SIGTERM)之后启用锁打印。默认情况下,此选项处于禁用状态。

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

-XX:+UnlockDiagnosticVMOptions

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

七、高级垃圾收集选项

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

-XX:ActiveProcessorCount=x

覆盖VM用于计算其用于各种操作(例如垃圾收集和ForkJoinPool)的线程池大小的CPU数量。
VM通常从操作系统确定可用处理器的数量。在docker容器中运行多个Java进程时,此标志可用于划分CPU资源。即使UseContainerSupport未启用此标志也会受到尊重。有关-XX:-UseContainerSupport启用和禁用容器支持的说明,请参见。

-XX:+AggressiveHeap

启用Java堆优化。这将根据计算机的配置(RAM和CPU)将各种参数设置为最适合具有密集内存分配的长时间运行的作业。默认情况下,该选项处于禁用状态并且未优化堆。

-XX:+AlwaysPreTouch

启用在JVM初始化期间接触Java堆上的每个页面。这会在进入main()方法之前将所有页面都放入内存中。该选项可用于测试模拟所有虚拟内存映射到物理内存的长时间运行的系统。默认情况下,此选项处于禁用状态,并且在JVM堆空间填满时提交所有页面。

-XX:+ScavengeBeforeFullGC

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

-XX:InitialHeapSize=size

设置内存分配池的初始大小(以字节为单位)。此值必须是0或1024的倍数且大于1MB。默认值是在运行时根据系统配置选择的。
以下示例显示如何使用各种单位将分配的内存大小设置为6MB:

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

如果将此选项设置为0,则初始大小将设置为分配给老年代和年轻代的大小之和。可以使用该-XX:NewSize选项设置年轻代的堆大小。
请注意,该-Xms选项设置了堆的最小和初始堆大小。如果-Xms出现在-XX:InitialHeapSize命令行之后,则初始堆大小设置为使用指定的值-Xms

-XX:MaxHeapSize=size

-XX:MaxHeapSize选项等效于-Xmx.

-XX:NewSize=size

为年轻代(nursery)设置堆的初始大小(以字节为单位)。
堆的年轻代区域用于新对象。GC在该区域执行的频率高于其他区域。如果年轻代的大小太小,则会执行大量的minor GC。如果大小太大,则只会执行完整的GC,这可能需要很长时间才能完成。Oracle建议您将年轻代的大小保持在整个堆大小的一半到四分之一之间。
下面的例子展示了如何使用不同的单位将年轻代的初始大小设置为256MB:

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

-XX:NewSize选项等效于-Xmn.

-XX:MaxNewSize=size

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

-XX:NewRatio=ratio

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

-XX:NewRatio=1

-XX:SurvivorRatio=ratio

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

-XX:SurvivorRatio=4

-XX:MaxHeapFreeRatio=percent

设置GC事件后允许的最大空闲堆空间百分比(0到100)。如果空闲堆空间扩展到此值以上,则堆将缩小。默认情况下,此值设置为70%。
以下示例显示如何将最大空闲堆比率设置为75%:

-XX:MaxHeapFreeRatio=75

-XX:MaxMetaspaceSize=size

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

-XX:MaxMetaspaceSize=256m

-XX:MaxRAMPercentage=percent

在应用人体工程学启发式算法之前,将JVM可用于Java堆的最大内存量设置为选项中所述确定的最大内存量的百分比-XX:MaxRAM。默认值为25%。
如果此选项和其他影响最大内存量的选项的组合结果大于压缩oops可寻址的内存范围,则指定此选项将禁用压缩oops的自动使用。-XX:UseCompressedOops有关压缩oops的更多信息,请参见。
以下示例显示如何设置用于Java堆的最大内存量的百分比:

-XX:MaxRAMPercentage=75

-XX:InitialTenuringThreshold=threshold

可以设定老年代阀值的初始值

-XX:MaxTenuringThreshold=threshold

设置晋升到老年代阈值。最大值为15。并行(吞吐量)收集器的默认值为15,CMS收集器的默认值为6。
以下示例显示如何将最大任期阈值设置为10:

-XX:MaxTenuringThreshold=10

-XX:TargetSurvivorRatio=percent

设置在年轻垃圾收集后使用的幸存者空间的所需百分比(0到100)。默认情况下,此选项设置为50%。
以下示例显示如何将目标幸存者空间比率设置为30%:

-XX:TargetSurvivorRatio=30

-XX:MetaspaceSize=size

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

-XX:MinRAMPercentage=percent

在应用人体工程学启发式算法之前,将JVM可用于Java堆的最大内存量设置为如-XX:MaxRAM小堆选项中所述确定的最大内存量的百分比。小堆是大约125MB的堆。默认值为50%。
以下示例显示了如何为小堆设置用于Java堆的最大内存量的百分比:

-XX:MinRAMPercentage=75

-XX:MinHeapFreeRatio=percent

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

-XX:MinHeapFreeRatio=25

-XX:InitialRAMPercentage=percent

在应用人体工程学启发式算法之前,将JVM将用于Java堆的初始内存量设置为-XX:MaxRAM选项中所述确定的最大内存量的百分比。默认值为1.5625%。
以下示例显示如何设置用于Java堆的初始内存量的百分比:

-XX:InitialRAMPercentage=5

-XX:SoftRefLRUPolicyMSPerMB=time

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

-XX:SoftRefLRUPolicyMSPerMB=2500

-XX:StringDeduplicationAgeThreshold=threshold

String达到指定年龄的对象被视为重复数据删除的候选对象。一个对象的年龄是衡量它在垃圾收集中幸存下来的次数。这有时被称为任期;请参阅-XX:+PrintTenuringDistribution选项。请注意,String在达到此年龄之前提升到旧堆区域的对象始终被视为重复数据删除的候选对象。此选项的默认值为3。查看-XX:+UseStringDeduplication选项。

-XX:+UseGCOverheadLimit

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

-XX:+NeverTenure

对象永远不会晋升到老年代.当我们确定不需要老年代时,可以这样设置。这样设置风险很大,并且会浪费至少一半的堆内存。

-XX:+AlwaysTenure

表示没有幸存区,所有对象在第一次GC时,会晋升到老年代。

7.1 打印信息

-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的对象在两次清理中幸存下来(在第二次清理期间,它们被从一个幸存者空间复制到下一个)。等等。
在前面的例子中,28992024字节在一次清理中幸存下来并从eden复制到幸存者空间,1366864字节被年龄2的对象占用,依此类推。每行中的第三个值是年龄n或年龄的对象的累积大小较少的。
默认情况下,此选项处于禁用状态。

-XX:+UseSerialGC

启用串行垃圾收集器的使用。对于不需要垃圾收集任何特殊功能的小型简单应用程序,这通常是最佳选择。默认情况下,此选项处于禁用状态,并根据机器的配置和JVM的类型自动选择收集器。

7.2 Parallel

-XX:+UseParallelGC

允许使用并行清理垃圾收集器(也称为吞吐量收集器)通过利用多个处理器来提高应用程序的性能。默认情况下,此选项处于禁用状态,并根据机器的配置和JVM的类型自动选择收集器。如果已启用,则该-XX:+UseParallelOldGC选项将自动启用,除非您明确禁用它。

-XX:+UseParallelOldGC

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

-XX:ParallelGCThreads=threads

设置用于年轻代和老年代并行垃圾回收的线程数。默认值取决于JVM可用的CPU数量。
例如,要将并行GC的线程数设置为2,请指定以下选项:

-XX:ParallelGCThreads=2

-XX:MaxGCPauseMillis=time

设置最大GC暂停时间的目标(以毫秒为单位)。这是一个软目标,JVM将尽最大努力实现它。默认情况下,没有最大暂停时间值。
以下示例显示如何将最大目标暂停时间设置为500毫秒:

-XX:MaxGCPauseMillis=500

-XX:GCTimeRatio=value

表示希望在GC花费不超过应用程序执行时间的1/(1+value),value为大于0小于100的整数。
换句话说,此参数的值表示运行用户代码时间是GC运行时间的value倍。
举个官方的例子,参数设置为19,那么GC最大花费时间的比率=1/(1+19)=5%,程序每运行100分钟,允许GC停顿共5分钟,其吞吐量=1-GC最大花费时间比率=95%
默认情况下,VM设置此值为99,运行用户代码时间是GC停顿时间的99倍,即GC最大花费时间比率为1%
选择此参数应对server端程序是很适合的,设置过大会使堆变大,直至接近最大堆设置的值。

-XX:+UseNUMA

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

-XX:+ParallelRefProcEnabled

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

-XX:+UseAdaptiveSizePolicy

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

-XX:InitialSurvivorRatio=ratio

设置吞吐量垃圾收集器使用的初始幸存者空间比率(由-XX:+UseParallelGC-XX:+UseParallelOldGC选项启用)。
默认情况下,吞吐量垃圾收集器使用-XX:+UseParallelGC-XX:+UseParallelOldGC选项启用自适应大小调整,并根据应用程序行为调整幸存者空间的大小,从初始值开始。
如果禁用了自适应大小调整(使用该-XX:-UseAdaptiveSizePolicy选项),-XX:SurvivorRatio则应使用该选项为整个应用程序执行设置幸存者空间的大小。
根据年轻代的大小(Y)和初始幸存者空间比率(R),可以使用以下公式计算幸存者空间的初始大小(S):

\[S=Y/(R+2) \]

等式中的2表示两个幸存者空间。指定为初始幸存空间比率的值越大,初始幸存空间大小越小。
默认情况下,初始幸存者空间比例设置为8。如果使用年轻代空间大小的默认值(2MB),则幸存者空间的初始大小将为0.2MB。
以下示例显示如何将初始幸存者空间比率设置为4:

-XX:InitialSurvivorRatio=4

7.3 CMS

-XX:+UseParNewGC

启用在年轻代中使用并行线程进行收集。默认情况下,此选项处于禁用状态。当设置该-XX:+UseConcMarkSweepGC选项时,它会自动启用。

-XX:+UseConcMarkSweepGC

为老年代启用CMS垃圾收集器。当吞吐量(-XX:+UseParallelGC)垃圾收集器无法满足应用程序延迟要求时,建议使用CMS垃圾收集器或G1垃圾收集器(-XX:+UseG1GC)。默认情况下,此选项处于禁用状态,并根据机器的配置和JVM的类型自动选择收集器。当启用该选项时,-XX:+UseParNewGC选项将自动设置,你不应该禁用它,因为下面的选项组合已经在JDK 8被弃用:-XX:+UseConcMarkSweepGC -XX:-UseParNewGC

-XX:CMSExpAvgFactor=percent

设置在计算并发收集统计的指数平均值时用于对当前样本进行加权的时间百分比(0到100)。默认情况下,指数平均因子设置为25%。以下示例显示如何将因子设置为15%:

-XX:CMSExpAvgFactor=15

-XX:+CMSScavengeBeforeRemark

在CMS注释步骤之前启用清理尝试。默认情况下,此选项处于禁用状态。

-XX:CMSTriggerRatio=percent

设置在-XX:MinHeapFreeRatioCMS收集周期开始之前分配的指定值的百分比(0到100)。默认值设置为80%。以下示例显示如何将占用率设置为75%:

-XX:CMSTriggerRatio=75

-XX:-CMSPrecleaningEnabled

不进行预清理,CMS在并发标记和重新标记的这段时间内,会有一个预清理的工作,而这个通过会尝试5秒之内等待来一次YGC。以免在后面的重新标记阶段耗费大量时间来标记新生代的对象。

-XX:ConcGCThreads=threads

设置用于并发GC的线程数。默认值取决于JVM可用的CPU数量。例如,要将并发GC的线程数设置为2,请指定以下选项:

-XX:ConcGCThreads=2

如果未设置,JVM会根据并行收集器中的-XX:ParallelGCThreads参数的值来计算出默认的并行CMS线程数。该公式是$$ConcGCThreads=(ParallelGCThreads+3)/4$$。因此,对于CMS收集器,-XX:ParallelGCThreads标志不仅影响“stop-the-world”垃圾收集阶段,还影响并发阶段。
总之,有不少方法可以配置CMS收集器的多线程执行。正是由于这个原因,建议第一次运行CMS收集器时使用其默认设置,然后如果需要调优再进行测试。只有在生产系统中测量(或类生产测试系统)发现应用程序的暂停时间的目标没有达到,就可以通过这些标志应该进行GC调优。

-XX:+CMSConcurrentMTEnabled

当该标志被启用时,并发的CMS阶段将以多线程执行(因此,多个GC线程会与所有的应用程序线程并行工作)。该标志已经默认开启,如果顺序执行更好,这取决于所使用的硬件,多线程执行可以通过-XX:-CMSConcurremntMTEnabled禁用。

-XX:CMSInitiatingOccupancyFraction=percent
设置开始CMS收集周期的老年代占用率(0到100)的百分比。默认值设置为-1。任何负值(包括默认值)都意味着-XX:CMSTriggerRatio用于定义初始占用率的值。以下示例显示如何将占用率设置为20%:

-XX:CMSInitiatingOccupancyFraction=20

-XX:+UseCMSInitiatingOccupancyOnly

允许使用占用值作为启动CMS收集器的唯一标准。默认情况下,此选项处于禁用状态,可以使用其他条件。

-XX:+CMSClassUnloadingEnabled

在使用并发标记清除(CMS)垃圾收集器时启用类卸载。默认情况下启用此选项。要禁用CMS垃圾收集器的类卸载,请指定-XX:-CMSClassUnloadingEnabled.

-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选项一起启用。

7.4 G1

-XX:+UseG1GC

启用垃圾优先(G1)垃圾收集器。它是一个服务器式垃圾收集器,针对具有大量RAM的多处理器机器。它以高概率满足GC暂停时间目标,同时保持良好的吞吐量。建议将G1收集器用于需要大堆(大小约为6GB或更大)且GC延迟要求有限(稳定且可预测的暂停时间低于0.5秒)的应用程序。默认情况下,此选项处于禁用状态,并根据机器的配置和JVM的类型自动选择收集器。

-XX:G1HeapRegionSize=size

设置G1Java堆区域大小。值是2的幂,介于1MB和32MB之间。默认区域大小是根据堆大小以符合人体工程学的方式确定的。
以下示例显示如何将细分的大小设置为16MB:

-XX:G1HeapRegionSize=16m

-XX:+G1PrintHeapRegions

启用打印有关哪些区域已分配以及哪些由G1收集器回收的信息。默认情况下,此选项处于禁用状态。

-XX:G1ReservePercent=percent

设置保留为虚假上限的堆的百分比(0到50),以减少G1收集器升级失败的可能性。默认情况下,此选项设置为10%。
以下示例显示如何将保留堆设置为20%:

-XX:G1ReservePercent=20

-XX:+UseStringDeduplication

启用字符串重复数据删除。默认情况下,此选项处于禁用状态。要使用此选项,您必须启用垃圾优先(G1)垃圾收集器。查看-XX:+UseG1GC选项。String通过利用许多String对象相同的事实,字符串重复数据删除减少了Java堆上对象的内存占用。不是每个String对象都指向自己的字符数组,而是相同的String对象可以指向并共享相同的字符数组。

-XX:InitiatingHeapOccupancyPercent=percent

设置启动并发GC周期的堆占用百分比(0到100)。它被垃圾收集器使用,它们根据整个堆的占用率触发并发GC周期,而不仅仅是其中一代(例如,G1垃圾收集器)。
默认情况下,初始值设置为45%。值0表示不间断GC循环。以下示例显示如何将启动堆占用率设置为75%:

-XX:InitiatingHeapOccupancyPercent=75

7.5 其他

-XX:+UseSHM

在Linux上,使JVM能够使用共享内存来设置大页面。

-XX:+UseTLAB

允许在年轻代空间中使用线程本地分配块(TLAB)。默认启用此选项。

-XX:TLABSize=size

设置线程本地分配缓冲区(TLAB)的初始大小(以字节为单位)。如果此选项设置为0,则JVM会自动选择初始大小。
以下示例显示如何将初始TLAB大小设置为512KB:

-XX:TLABSize=512k

7.6 弃用和删除的选项

这些选项包含在以前的版本中,在JDK 8中已弃用。

-Xincgc
启用增量垃圾回收。

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

-XX:CMSIncrementalDutyCycle=percent
设置允许并发收集器运行的次要收集之间的时间百分比(0到100)。没有替换-XX:+CMSIncrementalMode

-XX:CMSIncrementalDutyCycleMin=percent
设置次要收集之间的时间百分比(0到100),这-XX:+CMSIncrementalPacing是启用时占空比的下限。没有替换-XX:+CMSIncrementalMode

-XX:+CMSIncrementalMode
为CMS收集器启用增量模式。以及其他以CMSIncremental.

-XX:CMSIncrementalOffset=percent
设置增量模式占空比在次要收集之间的时间段内向右移动的时间百分比(0到100)。没有替换-XX:+CMSIncrementalMode

-XX:+CMSIncrementalPacing
根据在JVM运行时收集的统计信息启用增量模式占空比的自动调整。没有替换-XX:+CMSIncrementalMode

-XX:CMSIncrementalSafetyFactor=percent
设置计算占空比时用于增加保守性的时间百分比(0到100)。没有替换-XX:+CMSIncrementalMode

-XX:CMSInitiatingPermOccupancyFraction=percent
设置启动GC的永久代占用百分比(0到100)。

-XX:MaxPermSize=size
设置最大永久代空间大小(以字节为单位)。被该-XX:MaxMetaspaceSize选项取代。

-XX:PermSize=size
设置分配给永久代的空间(以字节为单位),如果超出则触发垃圾回收。被该-XX:MetaspaceSize选项取代。

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

-XX:+UseStringCache
启用缓存常用分配的字符串。

八、性能调优示例

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

8.1 示例1 - 调整以获得更高的吞吐量

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

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

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

九、大页面

也称为大页面,大页面是显着大于标准内存页面大小(因处理器和操作系统而异)的内存页面。大页面优化处理器转换后备缓冲区。

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

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

9.1 大页面支持

Solaris和Linux支持大页面。

Solaris

Solaris 9及更高版本包括多页面大小支持(MPSS);无需额外配置

Linux

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

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

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

  1. 如果您正在使用该选项-XX:+UseSHM(而不是-XX:+UseHugeTLBFS),则增加该SHMMAX值。它必须大于Java堆大小。在具有4GB物理RAM(或更少)的系统上,以下内容将使所有内存可共享:
    # echo 4294967295 > /proc/sys/kernel/shmmax
    
  2. 如果您使用选项-XX:+UseSHM-XX:+UseHugeTLBFS,则指定大页数。在以下示例中,4GB系统中的3GB为大页面保留(假设大页面大小为2048kB,则3GB= 3 * 1024MB = 3072MB = 3072 * 1024kB = 3145728kB和3145728kB / 200 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以启用标准扩展目录(由系统属性指定java.ext.dirs扩展机制架构)和应用程序类路径(请参阅“设置类路径”)中的类以放置在共享存档中. AppCDS减少了应用程序的占用空间并缩短了启动时间,前提是从应用程序类路径加载了大量类。

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

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

以下步骤创建一个共享存档文件,其中包含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选项不支持包含目录名称的类路径。

  1. 创建一个名为的共享存档,hello.jsa其中包含中的所有类hello.classlist
java -XX:+UnlockCommercialFeatures -Xshare:dump -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa
 -XX:SharedClassListFile=hello.classlist -cp hello.jar

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

  1. test.Hello使用共享存档运行应用程序hello.jsa
java -XX:+UnlockCommercialFeatures -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello

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

  1. 验证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

10.2 跨多个应用程序进程共享共享档案

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

以下步骤创建应用程序HelloHi可以使用的共享存档。

  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),所以这两个应用程序可以共享一个共享存档文件。

  1. 创建将共享共享存档文件的所有应用程序使用的类的单个列表。下面的命令组合中的文件hello.classlisthi.classlist一个文件,common.classlist
cat hello.classlist hi.classlist > common.classlist
  1. 创建一个名为的共享存档,common.jsa其中包含中的所有类common.classlist
java -XX:+UnlockCommercialFeatures -Xshare:dump -XX:SharedArchiveFile=common.jsa -XX:+UseAppCDS
 -XX:SharedClassListFile=common.classlist -cp common.jar

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

  1. 使用相同的共享存档运行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: 顺利完成
  • >0: 发生错误

十二、参考文章

posted @ 2022-04-22 18:10  夏尔_717  阅读(1218)  评论(0编辑  收藏  举报