很多都是谷歌翻译过来的,看不懂去看官方文档和百度
使用和阅读须知:
1.由于部分机器翻译缘故,部分指令有中文符号与空格.使用时请注意替换符号与空格
2.本篇文章基于Java SE 8
3.本文章翻译子windows系统下的参数系列,因为笔者的学习环境基于windows,其他
系统平台请自行参考:
Java Platform, Standard Edition (Java SE) 8 :https://docs.oracle.com/javase/8/
概要
java [options] classname [args]
java [options] -jar文件名[args]
javaw [options] classname [args]
javaw [options] -jar filename [args]
选项命令行选项由空格分隔。参阅选项。类名要启动的类的名称。文件名要调用的Java归档(JAR)文件的名称。仅与-jar选项一起使用。ARGS传递给main()方法的参数用空格分隔。
描述
java命令启动一个Java应用程序。它通过启动Java运行时环境(JRE),加载指定的类并调用该类的main()方法来实现此目的。该方法必须声明为public和static,它不能返回任何值,并且它必须接受一个String数组作为参数。方法声明具有以下形式:
public static void main(String [] args)
通过加载具有main()方法或扩展javafx.application.Application的类,java命令可用于启动JavaFX应用程序。在后一种情况下,启动程序构造Application类的一个实例,调用其init()方法,然后调用start(javafx.stage.Stage)方法。
默认情况下,不是java命令选项的第一个参数是要调用的类的全限定名。如果指定了-jar选项,则其参数是包含应用程序的类和资源文件的JAR文件的名称。启动类必须在其源代码中由Main-Class清单标题指示。
JRE在三个位置中搜索启动类(以及应用程序使用的其他类):引导类路径(bootstrap class path),已安装的扩展(installed extensions)和用户的类路径(user's class path.)。[注]对应3个类加载器
类文件名或JAR文件名后面的参数传递给main()方法。
javaw命令与java相同,只是在javaw中没有关联的控制台窗口。如果不希望显示命令提示符窗口,请使用javaw。但是,如果启动失败,javaw启动程序将显示一个包含错误信息的对话框。
选项
java命令支持广泛的选项,可以分为以下几类:
1.标准选项(Standard Options)2.非标准选项(Non-Standard Options)3.高级运行时选项(Advanced Runtime Options)4.高级JIT编译器选项(Advanced JIT Compiler Options)5.高级可维护选项(Advanced Serviceability Options)6.高级垃圾收集选项(Advanced Garbage Collection Options)
Java虚拟机(JVM)的所有实现都支持标准选项。它们用于常见操作,例如检查JRE的版本,设置类路径,启用详细输出等。
非标准选项是特定于Java HotSpot虚拟机的通用选项,因此它们不保证被所有JVM实现支持,并且可能会有变化。这些选项以-X开头。
高级选项不建议随意使用。这些是用于调整Java HotSpot虚拟机操作的特定区域的开发人员选项,这些操作通常具有特定的系统要求,并且可能需要对系统配置参数进行特权访问。它们也不能保证被所有JVM实现支持,并且可能会发生变化。高级选项以-XX开头。
要跟踪最新版本中不推荐使用或删除的选项,在文档末尾会有一个名为“已弃用和已除去选项”的部分。
boolean选项用于启用默认禁用的功能或禁用默认启用的功能。这些选项不需要参数。boolean-XX选项使用加号(-XX:+ OptionName)启用,并使用减号(-XX:-OptionName)禁用。
对于需要参数的选项,参数可以通过空格,冒号(:)或等号(=)与选项名称分开,或者参数可以直接跟随选项(每个选项的确切语法不同)。如果您希望以字节为单位指定大小,则可以不使用后缀,也可以使用后缀k或K表示千字节(KB),m或M表示兆字节(MB),g或G表示千兆字节(GB)。例如,要将大小设置为8 GB,可以指定8g,8192m,8388608k或8589934592作为参数。如果您希望指定百分比,请使用从0到1的数字(例如,指定0.25当做25%)。
标准选项(Standard Options)
这些是所有JVM实现都支持的最常用选项。
-agentlib:libname[=options]
加载指定的本地代理程序库。库名之后,可以使用特定于库的逗号分隔列表选项。如果指定了选项-agentlib:foo,则JVM将尝试在PATH系统变量指定的位置加载名为foo.dll的库。以下示例显示了如何加载堆分析工具(HPROF)库,并每隔20 ms获取一个简单CPU信息,栈深度为3:
-agentlib:hprof=cpu=samples,interval=20,depth=3
以下示例显示如何加载 Java Debug Wire Protocol (JDWP)库并监听端口8000上的socket连接,并在加载主类之前挂起JVM:
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
有关本地代理库的更多信息,请参阅以下内容:http://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html 中的java.lang.instrument包描述JVM工具界面指南中的代理程序命令行选项,位于http://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#starting
agentpath:pathname[=options]
加载由绝对路径名指定的本地代理程序库。 此选项等同于-agentlib,但要使用库的完整路径和文件名。
-client
选择Java HotSpot客户端VM。 Java SE开发工具包(JDK)的64位版本目前忽略此选项,而是使用Server VM。
有关默认JVM选择,请参阅Server-Class Machine Detection : http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html
-Dproperty=value
设置系统属性值。 该属性变量是一个不带空格的字符串,表示该属性的名称。 值变量是一个表示属性值的字符串。 如果value是一个带空格的字符串,则将其用引号引起来(例如-Dfoo="foo bar")。
-disableassertions[:[packagename]...|:classname]/-da[:[packagename]...|:classname]
禁用断言。默认情况下,所有包和类中的断言都是禁用的。
如果没有参数,-disableassertions(-da)将禁用所有包和类中的声明。在packagename参数以...结尾的情况下,将禁用指定包和任何子包中的断言。如果参数只是...,那么会禁用当前工作目录中未命名包中的断言。使用classname参数,交换机将禁用指定类中的断言。
-disableassertions(-da)选项适用于所有类加载器和系统类(它们没有类加载器)。这个规则有一个例外:如果该选项没有提供参数,那么它不适用于系统类。这样可以很容易地禁用除系统类以外的所有类中的断言。 -disablesystemassertions选项使您可以禁用所有系统类中的断言。
要显式启用特定包或类中的断言,请使用-enableassertions(-ea)选项。两个选项可以同时使用。例如,要在包com.wombat.fruitbat(和任何子包)中启用断言但在类com.wombat.fruitbat.Brickbat中禁用的情况下运行MyClass应用程序,请使用以下命令:
java -ea:com.wombat.fruitbat ... -da:com.wombat.fruitbat.Brickbat MyClass
-enablesystemassertions/-esa
开启所有系统类断言
-help/-?
显示java命令的可用信息而不实际运行JVM。
-jar filename
执行封装在JAR文件中的程序。 filename参数是带有清单的JAR文件的名称,该清单包含Main-Class:classname形式的行,该行使用public static void main(String[] args)方法定义该类,该方法充当您的应用程序的起点。
当使用-jar选项时,指定的JAR文件是所有用户类的资源,而其他类路径设置将被忽略。
有关JAR文件的更多信息,请参阅以下资源:
2. Java存档(JAR)文件指南,位于 http://docs.oracle.com/javase/8/docs/technotes/guides/jar/index.html
3. 课程:打包JAR文件中的程序 http://docs.oracle.com/javase/tutorial/deployment/jar/index.html
-javaagent:jarpath[=options]
加载指定的Java编程语言代理。 有关检测Java应用程序的更多信息,请参阅
http://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary 上的Java API文档中的java.lang.instrument的包描述
-jre-restrict-search
版本搜索中包含用户私有的JRE。
-no-jre-restrict-search
从版本搜索中排除用户私有JRE。
-server
选择Java HotSpot Server VM。 64位版本的JDK仅支持服务器虚拟机,因此在这种情况下,该选项是隐含的。
有关默认JVM选择,请参阅服务器级机器检测 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html
-showversion
显示版本信息并继续执行应用程序。该选项等同于-version选项,只是后者指示JVM在显示版本信息后退出。
-splash:imgname
用imgname指定的图像显示启动画面。例如,要在启动应用程序时从images目录显示splash.gif文件,请使用以下选项:
-splash:img/splash.gif
-verbose:class
显示有关每个加载的类的信息。
-verbose:GC
显示有关每个垃圾收集(GC)事件的信息。
-verbose:JNI
显示有关使用本机方法和其他Java Native Interface(JNI)活动的信息。
-version
显示版本信息,然后退出。该选项等同于-showversion选项,只是后者在显示版本信息后不指示JVM退出。
-version:release
指定用于运行应用程序的发行版本。如果调用的java命令的版本不符合此规范,并且在系统上找到适当的实现,则将使用适当的实现。
release参数指定了确切的版本字符串,或者是由空格分隔的版本字符串和范围列表。版本字符串是版本号的开发人员指定,格式如下:1.x.0_u(其中x是主要版本号,u是更新版本号)。版本范围由版本字符串组成,后跟加号(+)以指定此版本或更高版本,或版本字符串的一部分,后跟星号(*)以指定具有匹配前缀的任何版本字符串。版本字符串和范围可以使用逻辑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+"
仅当发布参数中有空格时,才需要引号。
对于JAR文件,首选项是在JAR文件清单中指定版本要求,而不是在命令行上。
非标准选项/Non-Standard Options
这些选项是特定于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 Native Interface(JNI)函数执行其他检查。具体来说,它在处理JNI请求之前验证传递给JNI函数的参数和运行时环境数据。遇到的任何无效数据都表明本机代码存在问题,在这种情况下,JVM将以无法恢复的错误终止。使用此选项时,预计性能会下降。
-Xcomp
在第一次调用时强制编译方法。默认情况下,客户端VM(-client)执行1,000个已解释的方法调用,服务器VM(-server)执行10,000个已解释的方法调用以收集有效编译的信息。指定-Xcomp选项会禁用已解释的方法调用,从而以牺牲效率为代价来提高编译性能。
您还可以使用-XX:CompileThreshold选项在编译之前更改已解释的方法调用的数量。
表示所有字节码都首先被编译成本地代码,然后再执行。
JIT编译器的模式之一
-Xdebug
什么也没做。提供向后兼容性。
-Xdiag
显示其他诊断消息。
-Xfuture
启用严格的类文件格式检查,以强制与类文件格式规范紧密一致。鼓励开发人员在开发新代码时使用此标志,因为更严格的检查将成为未来版本中的默认值。
-Xint
以仅解释模式运行应用程序。禁用对本机代码的编译,并且解释器将执行所有字节码。暂时(JIT)编译器提供的性能优势在此模式下不存在。
表示禁用JIT,所有字节码都被解释执行,这个模式的速度最慢的。
JIT编译器的模式之一
-Xinternalversion
显示比-version选项更详细的JVM版本信息,然后退出。
-Xloggc:filename
设置应将重定向的GC事件信息重定向到的文件以进行日志记录。 写入此文件的信息类似于-verbose:gc的输出,其中包含自每个记录事件之前的第一个GC事件以来经过的时间。 如果两者都使用相同的java命令,则-Xloggc选项会覆盖-verbose:gc。
例:
-Xloggc:garbage-collection.log
-Xmaxjitcodesize=size
指定JIT编译代码的最大代码高速缓存大小(以字节为单位)。 附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。 默认的最大代码缓存大小为240 MB;
如果使用-XX:- TieredCompilation选项禁用分层编译,则默认大小为48 MB:
-Xmaxjitcodesize=240m
此选项等效于-XX:ReservedCodeCacheSize。
-Xmixed
除了热方法之外,解释器执行所有字节码,热方法被编译为本机代码。
默认模式,让JIT根据程序运行的情况,有选择地将常用代码编译成本地代码。(如:被大量循环的代码)
JIT编译器的模式之一
-Xmnsize
设置年轻代(花园?托儿所?nursery我不知道怎么翻译)的堆的初始和最大大小(以字节为单位)。附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。
堆的年轻代区域用于新对象。 GC在该区域比在其他区域更频繁地进行。如果年轻一代的规模太小,那么将会进行大量的小型垃圾收集。如果大小太大,则只执行完整的垃圾收集,这可能需要很长时间才能完成。 Oracle建议您将年轻代的大小保持在整个堆大小的一半到四分之一之间。
以下示例显示如何使用各种单位将年轻代的初始和最大大小设置为256 MB:
-Xmn256m
-Xmn262144k
-Xmn268435456
您可以使用-XX : NewSize设置初始大小而使用-XX : MaxNewSize来设置最大大小,而不是-Xmn选项来设置年轻代的堆的初始大小和最大大小。
-Xmssize
设置堆的初始大小(以字节为单位)。 该值必须是1024的倍数且大于1 MB。 附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。
以下示例显示如何使用各种单位将分配的内存大小设置为6 MB:
-Xms6291456
-Xms6144k
-Xms6m
如果未设置此选项,则初始大小将设置为为旧代和年轻代分配的大小的总和。 可以使用-Xmn选项或-XX:NewSize选项设置年轻代的堆的初始大小。
-Xmxsize
指定内存分配池的最大大小(以字节为单位),以字节为单位。 该值必须是1024的倍数且大于2 MB。 附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。 根据系统配置在运行时选择默认值。 对于服务器部署,-Xms和-Xmx通常设置为相同的值。 请参阅http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html 上的Java SE HotSpot虚拟机垃圾收集调整指南中的“人机工程学(Ergonomics)”部分。
以下示例显示如何使用各种单位将分配的内存的最大允许大小设置为80 MB:
-Xmx83886080
-Xmx81920k
-Xmx80m
-Xmx选项等效于-XX : MaxHeapSize。
-Xnoclassgc
禁用类的垃圾收集(GC)[Disables garbage collection (GC) of classes]。 这可以节省一些GC时间,从而缩短应用程序运行期间的中断。
在启动时指定-Xnoclassgc时,应用程序中的类对象将在GC期间保持不变,并始终被视为实时。 这可能导致更多的内存被永久占用,如果不小心使用,将导致内存不足异常。
-Xprof
配置正在运行的程序并将分析数据发送到标准输出。此选项作为在程序开发中有用的实用程序提供,不适用于生产系统。
-Xrs
减少JVM对操作系统信号的使用。
关闭Hooks,通过在关闭时运行用户清理代码(例如关闭数据库连接)来启用Java应用程序的有序关闭,即使JVM突然终止也是如此。
JVM监视控制台控制事件,以实现意外终止的关闭挂钩。具体来说,JVM注册一个控制台控制处理程序,它启动shutdown-hook处理,并为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有两个后果:
Ctrl + Break线程转储不可用。
用户代码负责引导关闭挂钩运行,例如,在终止JVM时调用System.exit()。
-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存档。按照“设置类路径”中的说明指定应用程序类路径。
您应该使用每个新的JDK版本重新生成CDS存档。
-XshowSettings : category
显示设置并继续。此选项的可能类别参数包括以下内容:
all
显示所有类别的设置。这是默认值。
locale
显示与区域设置相关的设置。
properties
显示与系统属性相关的设置。
vm
显示JVM的设置。
配置正在运行的程序并将分析数据发送到标准输出。此选项作为在程序开发中有用的实用程序提供,不适用于生产系统。
-Xsssize
设置线程堆栈大小(以字节为单位)。附加字母k或K表示KB,m或M表示MB,g或G表示GB。默认值取决于虚拟内存。
以下示例以不同为单位将线程堆栈大小设置为1024 KB:
-Xss1m
-Xss1024k
-Xss1048576
此选项等效于-XX:ThreadStackSize。
-Xverify:mode
设置字节码验证器的模式。字节码验证可确保正确形成类文件,并满足“Java虚拟机规范”中第4.10节“类文件验证”中列出的约束。
不要关闭验证,因为这会减少Java提供的保护,并可能由于格式错误的类文件而导致问题。
类加载:加载-验证-准备-解析-初始化,这里是其中一个阶段:验证阶段
此选项的可能模式参数包括以下内容:
remote验证引导类加载器未加载的所有字节码。如果未指定-Xverify选项,则这是默认行为。all启用所有字节码的验证。none禁用所有字节码的验证。使用-Xverify:none不受支持。
Advanced Runtime Options/高级运行时选项
这些选项控制Java HotSpot VM的运行时行为。
-XX:+CheckEndorsedAndExtDirs
如果Java命令使用endorsed-standards override机制或扩展机制,则启用该选项以防止Java命令运行Java应用程序。此选项通过检查以下内容来检查应用程序是否正在使用这些机制之一:
设置了java.ext.dirs或java.endorsed.dirs系统属性。
lib / endorsed目录存在且不为空。lib / ext目录包含除JDK之外的任何JAR文件。系统范围的特定于平台的扩展目录包含任何JAR文件。
-XX:+ DisableAttachMechanism
启用禁用允许工具连接到JVM的机制的选项。默认情况下,此选项被禁用,这意味着启用了附加机制,您可以使用jcmd,jstack,jmap和jinfo等工具。
-XX:ErrorFile=filename
指定发生不可恢复的错误时写入错误数据的路径和文件名。默认情况下,此文件在当前工作目录中创建,并命名为hs_err_pidpid.log,其中pid是导致错误的进程的标识符。以下示例显示如何设置默认日志文件(请注意,进程的标识符指定为%p):
-XX:ErrorFile=/hs_err_pid%p.log
以下示例显示如何将错误日志文件设置为C:/log/java/java_error.log:
-XX:ErrorFile= C:/log/java/java_error.log
如果无法在指定目录中创建文件(由于空间不足,权限问题或其他问题),则会在操作系统的临时目录中创建该文件。临时目录由TMP环境变量的值指定;如果未定义该环境变量,则使用TEMP环境变量的值。
-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。
dumponexitpath=path
指定是否应生成JFR数据的转储文件
dumponexit={true|false}
指定当JVM以受控方式终止时是否应生成JFR数据的转储文件。默认情况下,此参数设置为false(不会生成退出时的转储文件)。要启用它,请将参数设置为true,并设置defaultrecording = true。
转储文件将写入dumponexitpath参数定义的位置。
dumponexitpath=path
如果设置dumponexit = true参数,则指定JVM数据的转储文件的路径和名称,该数据是在受控方式JVM退出时创建的。仅当您还设置defaultrecording = true时,设置路径才有意义。
如果指定的路径是目录,则JVM会分配一个显示创建日期和时间的文件名。如果指定的路径包含文件名,并且该文件已存在,则JVM通过将日期和时间戳附加到指定的文件名来创建新文件。
globalbuffersize=size
指定用于数据保留的主内存总量(以字节为单位)。附加k或K,以KB为单位指定大小,m或M指定大小(MB,g或G)以指定大小(以GB为单位)。默认情况下,大小设置为462848字节。
loglevel={quiet|error|warning|info|debug|trace}
指定JFR写入日志文件的数据量。默认情况下,它设置为info。
maxage=time
指定要为默认录制保留的磁盘数据的最长期限。附加s指定以秒为单位的时间,m表示分钟,h表示小时,d表示天(例如,指定30秒表示30秒)。默认情况下,最大年龄设置为15分钟(15m)。
仅当您设置disk = true参数时,此参数才有效。
maxchunksize=size
指定记录中数据块的最大大小(以字节为单位)。附加k或K,以KB为单位指定大小,m或M指定大小(MB,g或G)以指定大小(以GB为单位)。默认情况下,数据块的最大大小设置为12 MB。
maxsize=size
指定要为默认记录保留的磁盘数据的最大大小(以字节为单位)。附加k或K,以KB为单位指定大小,m或M指定大小(MB,g或G)以指定大小(以GB为单位)。默认情况下,磁盘数据的最大大小不受限制,此参数设置为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
指定每线程本地缓冲区大小(以字节为单位)。附加k或K,以KB为单位指定大小,m或M指定大小(MB,g或G)以指定大小(以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
设置New 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本机内存使用情况的模式。此选项的可能模式参数包括以下内容:
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选项运行userdump.exe实用程序,以便在出现无法恢复的错误时获取崩溃转储(%p指定当前进程):
-XX:OnError="userdump.exe %p"
上面的示例假定在PATH环境变量中指定了userdump.exe实用程序的路径。
-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:+PrintCommandLineFlags
允许打印出现在命令行上的符合人体工程学选择的JVM标志。了解JVM设置的人体工程学值(例如堆空间大小和选定的垃圾收集器)可能很有用。默认情况下,禁用此选项并且不打印标志。
-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.Object和hello.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表示天(例如,指定10米表示10分钟)。默认情况下,没有延迟,此参数设置为0。dumponexit={true|false}指定当JVM以受控方式终止时是否应生成JFR数据的转储文件。默认情况下,此参数设置为false(不会生成退出时的转储文件)。要启用它,请将参数设置为true。转储文件将写入filename参数定义的位置。例:
-XX:StartFlightRecording=name=test,filename=D: est.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表示天(例如,指定30秒表示30秒)。默认情况下,最大年龄设置为15分钟(15m)。maxsize=size指定要为默认记录保留的磁盘数据的最大大小(以字节为单位)。附加k或K,以KB为单位指定大小,m或M指定大小(MB,g或G)以指定大小(以GB为单位)。默认情况下,磁盘数据的最大大小不受限制,此参数设置为0。settings=path指定事件设置文件的路径和名称(类型为JFC)。默认情况下,使用default.jfc文件,该文件位于JAVA_HOME / jre / lib / jfr中。您可以通过用逗号分隔多个参数的值来指定它们。例如,要将记录保存到当前工作目录中的test.jfr,并指示JFR压缩日志文件,请指定以下内容:
-XX:StartFlightRecording=filename=test.jfr,compress=true
-XX:ThreadStackSize=size
设置线程堆栈大小(以字节为单位)。附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。默认值取决于虚拟内存。
以下示例显示如何以不同单位将线程堆栈大小设置为1024 KB:
-XX:ThreadStackSize=1m
-XX:ThreadStackSize=1024k
-XX:ThreadStackSize=1048576
此选项等效于-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:+UseAppCDS
启用应用程序类数据共享(AppCDS)。要使用AppCDS,还必须在CDS转储时间(请参阅-Xshare:dump选项)和应用程序运行时间期间指定选项-XX:SharedClassListFile和-XX:SharedArchiveFile的值。
这是一项商业功能,需要您还指定-XX:+UnlockCommercialFeatures选项。这也是一个实验性的特征;它可能在将来的版本中发生变化
-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:+UseLargePages
允许使用大页面内存。默认情况下,禁用此选项并且不使用大页面内存。
-XX:+UseMembar
允许在线程状态转换上发布membars。默认情况下,在除ARM服务器之外的所有平台上都禁用此选项。 (建议您不要在ARM服务器上禁用此选项。)
-XX:+UsePerfData
启用perfdata功能。默认情况下启用此选项以允许JVM监视和性能测试。禁用它会禁止创建hsperfdata_userid目录。要禁用perfdata功能,请指定-XX:-UsePerfData。
-XX:+AllowUserSignalHandlers
允许应用程序安装信号处理程序。默认情况下,禁用此选项,并且不允许应用程序安装信号处理程序。
高级JIT编译器选项/Advanced JIT Compiler Options
这些选项控制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会将分号视为命令end。例如,如果要仅排除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编译选项传递给指定的方法以代替最后一个参数(选项)。编译选项在方法名称后面的末尾设置。例如,要为StringBuffer类的append()方法启用BlockLayoutByFrequency选项,请使用以下命令:
-XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency
您可以指定多个编译选项,以逗号或空格分隔。在编译指定方法后打印生成的汇编代码。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()方法的汇编代码:
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:InlineSmallCode=1000
-XX:+Inline
启用方法内联。默认情况下启用此选项以提高性能。要禁用方法内联,请指定-XX:-Inline。
-XX:InlineSmallCode=size
为编译好的要内联方法设置最大的code 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:
<wiz_code_mirror>
-XX:MaxTrivialSize=size
设置要内联的简单方法的最大字节码大小(以字节为单位)。附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。默认情况下,一个简单方法的最大字节码大小设置为6个字节:
-XX:MaxTrivialSize = 6
-XX:+OptimizeStringConcat
启用字符串连接操作的优化。默认情况下启用此选项。要禁用字符串连接操作的优化,请指定-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引入了新指令XBEGIN,XABORT,XEND和XTEST。 XBEGIN和XEND指令包含一组作为事务运行的指令。如果在运行事务时未发现冲突,则会在XEND指令中一起提交内存和寄存器修改。 XABORT指令可用于显式中止事务,XEND指令用于检查事务中是否正在运行一组指令。
当另一个线程尝试访问同一事务时,对事务的锁定会膨胀,从而阻止最初未请求访问该事务的线程。 RTM要求在事务中止或失败时指定后备操作集。 RTM锁是一种委托给TSX系统的锁。
RTM提高了在关键区域中具有低冲突的高竞争锁的性能(这是不能同时由多个线程访问的代码)。 RTM还提高了粗粒度锁定的性能,这在多线程应用程序中通常表现不佳。 (粗粒度锁定是长时间保持锁定以最小化获取和释放锁定的开销的策略,而细粒度锁定是通过仅在必要时锁定并尽快解锁来尝试实现最大并行性的策略。此外,对于不同线程使用的轻度争用锁,RTM可以减少错误的缓存行共享,也称为缓存行乒乓。当来自不同处理器的多个线程访问不同资源但资源共享同一缓存行时,会发生这种情况。结果,处理器重复地使其他处理器的高速缓存行无效,这迫使它们从主存储器而不是它们的高速缓存读取。
-XX:+UseSHA
为SPARC硬件启用SHA加密散列函数的基于硬件的内在函数。 UseSHA与UseSHA1Intrinsics,UseSHA256Intrinsics和UseSHA512Intrinsics选项一起使用。
默认情况下启用UseSHA和UseSHA * 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支持此选项。
高级可维护选项/Advanced Serviceability Options
这些选项提供了收集系统信息和执行大量调试的功能。
-XX:+HeapDumpOnOutOfMemory
当抛出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
以下示例显示如何将堆转储文件设置为C:/log/java/java_heapdump.log:
-XX:HeapDumpPath=C:/log/java/java_heapdump.log
-XX:LogFile=path
设置写入日志数据的路径和文件名。默认情况下,该文件在当前工作目录中创建,名为hotspot.log。
以下示例显示如何将日志文件设置为C:/log/java/hotspot.log:
-XX:LogFile=C:/log/java/hotspot.log
-XX:+PrintClassHistogram
在Control + Break事件之后启用类实例直方图的打印。默认情况下,禁用此选项。
设置此选项等同于运行jmap -histo命令或jcmd pid GC.class_histogram命令,其中pid是当前Java进程标识符。
-XX:+PrintConcurrentLockss
在Control + Break事件之后启用java.util.concurrent锁的打印。默认情况下,禁用此选项。
设置此选项等同于运行jstack -l命令或jcmd pid Thread.print -l命令,其中pid是当前Java进程标识符。
-XX:+UnlockDiagnosticVMOptions
解锁用于诊断JVM的选项。默认情况下,此选项已禁用,诊断选项不可用。
高级垃圾回收器选项/Advanced Garbage Collection Options
这些选项控制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:CMSInitiatingOccupancyFraction=percent
设置启动CMS收集周期的旧代占用率(0到100)的百分比。默认值设置为-1。任何负值(包括默认值)都意味着-XX:CMSTriggerRatio用于定义初始占用率的值。
以下示例显示如何将占用率设置为20%:
-XX:CMSInitiatingOccupancyFraction=20
-XX:+CMSScavengeBeforeRemark
在CMS remark 步骤之前启用清理尝试。默认情况下,禁用此选项。
-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:+DisableExplicitGC
启用禁用处理对System.gc()的调用的选项。默认情况下禁用此选项,这意味着将处理对System.gc()的调用。如果禁用对System.gc()的调用处理,则JVM仍会在必要时执行GC。
-XX:+ExplicitGCInvokesConcurrent
允许使用System.gc()请求调用并发GC。
默认情况下禁用此选项,并且只能与-XX:+UseConcMarkSweepGC选项一起启用。
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
通过在并发GC循环期间使用System.gc()请求和卸载类,可以调用并发GC。默认情况下禁用此选项,并且只能与-XX:+UseConcMarkSweepGC选项一起启用。
-XX:G1HeapRegionSize=size
设置使用垃圾优先(G1)收集器时Java堆所细分的区域的大小。该值可以介于1 MB和32 MB之间。默认区域大小根据堆大小以符合人体工程学的方式确定。
以下示例显示如何将细分的大小设置为16 MB:
-XX:G1HeapRegionSize=16m
-XX:+G1PrintHeapRegions
允许打印有关哪些区域已分配以及哪些区域由G1收集器回收的信息。默认情况下,禁用此选项。
-XX:G1ReservePercent=percent
设置保留为false上限的堆的百分比(0到50),以减少G1收集器升级失败的可能性。
默认情况下,此选项设置为10%。
以下示例显示如何将保留堆设置为20%:
-XX:G1ReservePercent=20
-XX:InitialHeapSize=size
设置内存分配池的初始大小(以字节为单位)。该值必须为0或1024的倍数且大于1 MB。附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。根据系统配置在运行时选择默认值。请参阅 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html
上的Java SE HotSpot虚拟机垃圾收集调整指南中的“人机工程学”部分。
以下示例显示如何使用各种单位将分配的内存大小设置为6 MB:
-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)和初始幸存者空间比率(R)计算幸存者空间(S)的初始大小:
S=Y/(R+2)
等式中的2表示两个幸存者空间。指定为初始幸存者空间比的值越大,初始幸存者空间大小越小。
默认情况下,初始幸存者空间比率设置为8.如果使用年轻代空间大小的默认值(2 MB),则幸存者空间的初始大小将为0.2 MB。
以下示例显示如何将初始幸存者空间比率设置为4:
-XX:InitialSurvivorRatio=4
-XX:InitiatingHeapOccupancyPercent=percent
设置启动并发GC循环的堆占用百分比(0到100)。 它由垃圾收集器使用,它根据整个堆的占用而触发并发GC循环,而不仅仅是其中一代(例如,G1垃圾收集器)。
默认情况下,初始值设置为45%。 值0表示不间断的GC循环。 以下示例显示如何将启动堆占用率设置为75%:
-XX:InitiatingHeapOccupancyPercent=75
-XX:MaxGCPauseMillis=time
设置最大GC暂停时间的目标(以毫秒为单位)。这是一个软目标,JVM将尽最大努力实现它。
默认情况下,没有最大暂停时间值。
以下示例显示如何将最大目标暂停时间设置为500毫秒:
-XX:MaxGCPauseMillis=500
-XX:MaxHeapSize=size
设置内存分配池的最大大小(以字节为单位)。该值必须是1024的倍数且大于2 MB。附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。根据系统配置在运行时选择默认值。
对于服务器部署,-XX:InitialHeapSize 和 -XX:MaxHeapSize通常设置为相同的值。请参阅 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html
上的Java SE HotSpot虚拟机垃圾收集调整指南中的“人机工程学”部分。
以下示例显示如何使用各种单位将分配的内存的最大允许大小设置为80 MB:
-XX:MaxHeapSize=83886080
-XX:MaxHeapSize=81920k
-XX:MaxHeapSize=80m
-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: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: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
允许打印终身年龄信息。以下是输出的示例:
期望的幸存者大小48286924字节,新阈值10(最多10)
- age 1: 28992024 bytes, 28992024 total
- age 2: 1366864 bytes, 30358888 total
- age 3: 1425912 bytes, 31784800 total
...
1岁对象是最年轻的幸存者(它们是在之前的清除之后创建的,在最近的清除中幸存下来,并从伊甸园迁移到幸存者空间)。
2岁的物体在两次清除中幸存下来(在第二次清除期间,它们被从一个幸存者空间复制到下一个幸存者空间)。等等。
在前面的示例中,28 992 024个字节在一次清除中幸存,并从eden复制到幸存者空间,1 366 864个字节由2岁对象占用,等等。每行中的第三个值是年龄n的对象的累积大小或减。
默认情况下,禁用此选项。
-XX:+ScavengeBeforeFullGC
在每个完整GC之前启用年轻代的GC。默认情况下启用此选项。 Oracle建议您不要禁用它,因为在完整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垃圾收集器。 Oracle建议您在吞吐量(-XX:+UseParallelGC)垃圾收集器无法满足应用程序延迟要求时使用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:+ UseParNewGC选项而不使用-XX:+UseConcMarkSweepGC选项。
-XX:+UseSerialGC
允许使用串行垃圾收集器。对于不需要垃圾收集的任何特殊功能的小型和简单应用程序,这通常是最佳选择。默认情况下,禁用此选项,并根据计算机的配置和JVM的类型自动选择收集器。
-XX:+ UseStringDeduplication
启用字符串重复数据删除。 默认情况下,禁用此选项。 要使用此选项,必须启用垃圾优先(G1)垃圾收集器。 请参阅-XX:+UseG1GC选项。
字符串重复数据删除通过利用许多String对象相同的事实减少了Java堆上String对象的内存占用。 而不是每个String对象指向它自己的字符数组,相同的String对象可以指向并共享相同的字符数组。
-XX:+UseTLAB
允许在年轻代空间中使用线程局部分配块(TLAB)。 默认情况下启用此选项。
要禁用TLAB,请指定-XX:-UseTLAB。
已启用和移除的选项/Deprecated and Removed Options
这些选项包含在之前的版本中,但后来被认为是不必要的。
-Xincgc
启用增量垃圾收集。此选项在JDK 8中已弃用,无需替换。
-Xrunlibname
加载指定的调试/分析库。此选项已被-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中删除,无需替换。
性能调优示例/Performance Tuning Examples
以下示例显示如何使用实验性调整标志来优化吞吐量或提供较低的响应时间。
案例一:调整更高的吞吐量
java -d64 -server -XX:+AggressiveOpts -XX:+UseLargePages -Xmn10g -Xms26g -Xmx26g
案例二:调整较低的响应时间
java -d64 -XX:+UseG1GC -Xms26g Xmx26g -XX:MaxGCPauseMillis=500 -XX:+PrintGCTimeStamp
Lager Pages
Also known as huge pages, large pages are memory pages that are significantly larger than the standard memory page size (which varies depending on the processor and operating system). Large pages optimize processor Translation-Lookaside Buffers.
也称为huge pages,Large pages是显著大于标准memory pages大小的memory page(根据处理器和操作系统而变化)。Large pages优化处理器Translation-Lookaside Buffers。
A Translation-Lookaside Buffer (TLB) is a page translation cache that holds the most-recently used virtual-to-physical address translations. TLB is a scarce system resource. A TLB miss can be costly as the processor must then read from the hierarchical page table, which may require multiple memory accesses. By using a larger memory page size, a single TLB entry can represent a larger memory range. There will be less pressure on TLB, and memory-intensive applications may have better performance.
Translation-Lookaside Buffer(TLB)是一种page 转换缓存,它保存最近使用的虚拟到物理地址转换。 TLB是一种稀缺的系统资源。 TLB未命中可能是昂贵的,因为处理器必须从分层 page 表读取,这可能需要多次存储器访问。通过使用更大的内存页面大小,单个TLB条目可以表示更大的内存范围。 TLB的压力会减少,内存密集型应用程序可能会有更好的性能。
However, large pages page memory can negatively affect system performance. For example, when a large mount of memory is pinned by an application, it may create a shortage of regular memory and cause excessive paging in other applications and slow down the entire system. Also, a system that has been up for a long time could produce excessive fragmentation, which could make it impossible to reserve enough large page memory. When this happens, either the OS or JVM reverts to using regular pages.
但是,large pages的page memory会对系统性能产生负面影响。例如,当应用程序固定大量内存时,可能会导致常规内存不足并导致其他应用程序中的分页过多,从而降低整个系统的速度。此外,长时间运行的系统可能会产生过多的碎片,这可能导致无法保留足够大的page memory。发生这种情况时,OS或JVM将恢复使用常规页面。
Large Pages Support
只有Windows Server 2003支持Lager pages。 要使用此功能,管理员必须首先为将运行该应用程序的用户分配其他权限:
1.Select Control Panel -> Administrative Tools -> Local Security Policy.2.Select Local Policies -> User Rights Assignment.3.Double click Lock pages in memory; add users and/or groups.4.Reboot your system.
请注意,即使是将要运行应用程序的管理员,也需要执行这些步骤,因为管理员默认情况下没有权限将页面锁定在内存中。
Application Class Data Sharing
应用程序类数据共享(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 )和应用程序类路径(请参阅“设置类路径”) “)放在共享档案中。 如果从应用程序类路径加载大量类,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
请注意,因为Hello和Hi应用程序共享一个公共类路径前缀(它们的两个类路径都以common.jar开头),所以这两个应用程序可以共享一个共享的归档文件。
2.创建将共享共享存档文件的所有应用程序使用的单个类列表。
以下命令将文件hello.classlist和hi.classlist组合到一个文件common.classlist中:
type 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参数的值是Hello和Hi应用程序共享的公共类路径前缀。
4.使用相同的共享存档运行Hello和Hi应用程序:
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:发生错误