JDK8部分JVM参数说明(二)

网友投稿 1078 2022-05-30

高级JIT编译器选项

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

-XX:+ AggressiveOpts

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

-XX:AllocateInstancePrefetchLines = lines

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

-XX:AllocateInstancePrefetchLines = 1

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

-XX:AllocatePrefetchDistance = size

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

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

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

-XX:AllocatePrefetchDistance = 1024

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

-XX:AllocatePrefetchInstr = 指令

将预取指令设置为在分配指针之前预取。只有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

为预取指令设置生成的代码样式。的风格参数是从0至3的整数:

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

0

不要生成预取指令。

1

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

2

使用线程局部分配块(TLAB)水印指针来确定何时执行预取指令。

3

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

-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 =1024米

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

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

-XX:CompileCommand =排除,爪哇/郎/ String.indexOf

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

-XX:CompileCommand =排除,java.lang.String中的indexOf ::

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

-XX:CompileCommand = “排除,爪哇/郎/ String.indexOf,(Ljava /郎/字符串;)I”

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

-XX:CompileCommand =排除*的indexOf。

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

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

请注意,在使用-XX:CompileCommand选项解析在命令行上传递的命令之后,JIT编译器会从.hotspot_compiler文件中读取命令。您可以向此文件添加命令,也可以使用该-XX:CompileCommandFile选项指定其他文件。

要添加多个命令,请-XX:CompileCommand多次指定该选项,或使用换行符分隔符(\n)分隔每个参数。可以使用以下命令:

打破

在调试JVM时设置断点,以便在编译指定方法的开始时停止。

compileonly

除了指定的方法之外,从编译中排除所有方法。作为替代方法,您可以使用该-XX:CompileOnly选项,该选项允许指定多种方法。

dontinline

防止内联指定的方法。

排除

从编译中排除指定的方法。

救命

打印该-XX:CompileCommand选项的帮助消息。

排队

尝试内联指定的方法。

日志

排除-XX:+LogCompilation除指定方法之外的所有方法的编译日志记录(带选项)。默认情况下,对所有已编译的方法执行日志记录。

选项

此命令可用于将JIT编译选项传递给指定的方法以代替最后一个参数(选项)。编译选项在方法名称后面的末尾设置。例如,要启用类方法的BlockLayoutByFrequency选项,请使用以下命令:append()StringBuffer

-XX:CompileCommand =选项,爪哇/郎/的StringBuffer.append,BlockLayoutByFrequency

您可以指定多个编译选项,以逗号或空格分隔。

打印

在编译指定方法后打印生成的汇编代码。

安静

不要打印编译命令。默认情况下,使用 - XX:CompileCommand选项指定的命令将被打印; 例如,如果从编译中排除类的indexOf()方法String,则以下内容将打印到标准输出:

CompilerOracle:排除java / lang / String.indexOf

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

-XX:CompileCommandFile = filename

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

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

print java / lang / String toString

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

-XX:CompileOnly = 方法

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

-XX:CompileOnly =爪哇/郎/ string.length减,JAVA / UTIL /则为list.size

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

-XX:CompileOnly = java.lang.String中::长度,java.util.List中::大小

虽然不支持通配符,但您只能指定类或包名称来编译该类或包中的所有方法,并且只指定在任何类中使用此名称编译方法的方法:

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

-XX:CompileThreshold = 调用

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

-XX:CompileThreshold = 5000

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

-XX:+ DoEscapeAnalysis

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

-XX:InitialCodeCacheSize = size

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

-XX:InitialCodeCacheSize = 32K

-XX:+内嵌

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

-XX:InlineSmallCode = size

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

-XX:InlineSmallCode = 1000

-XX:+ LogCompilation

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

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

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

-XX:MaxInlineSize = size

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

-XX:MaxInlineSize = 35

-XX:MaxNodeLimit = 节点

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

-XX:MaxNodeLimit = 65000

-XX:MaxTrivialSize = size

设置要内联的简单方法的最大字节码大小(以字节为单位)。附加字母k或K表示千字节,m或M指示兆字节,g或G指示千兆字节。默认情况下,一个简单方法的最大字节码大小设置为6个字节:

-XX:MaxTrivialSize = 6

-XX:+ OptimizeStringConcat

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

-XX:+ PrintAssembly

通过使用外部disassembler.so库,可以为字节编码和本机方法打印汇编代码。这使您可以查看生成的代码,这可以帮助您诊断性能问题。

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

-XX:+ PrintCompilation

每次编译方法时,通过向控制台打印消息,从JVM启用详细诊断输出。这使您可以查看实际编译的方法。默认情况下,禁用此选项并且不打印诊断输出。

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

-XX:+ PrintInlining

允许打印内联决策。这使您可以查看哪些方法被内联。

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

-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的服务器虚拟机的64位支持。

此功能仅在使用sun.security.provider.SunSHA操作的提供程序时适用。

要禁用所有基于硬件的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 = /无功/日志/ JAVA / java_heapdump.hprof

-XX:LogFile = path

设置写入日志数据的路径和文件名。默认情况下,该文件在当前工作目录中创建,并以其命名hotspot.log。

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

-XX:日志文件= /无功/日志/ JAVA / hotspot.log

-XX:+ PrintClassHistogram

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

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

-XX:+ PrintConcurrentLocks

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

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

-XX:+ UnlockDiagnosticVMOptions

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

高级垃圾收集选项

这些选项控制Java HotSpot VM如何执行垃圾收集(GC)。

-XX:+ AggressiveHeap

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

-XX:+ AlwaysPreTouch

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

-XX:+ CMSClassUnloadingEnabled

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

-XX:CMSExpAvgFactor = 百分比

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

-XX:CMSExpAvgFactor = 15

-XX:CMSInitiatingOccupancyFraction = 百分比

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

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

-XX:CMSInitiatingOccupancyFraction = 20

-XX:+ CMSScavengeBeforeRemark

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

-XX:CMSTriggerRatio = 百分比

设置在-XX:MinHeapFreeRatioCMS收集周期开始之前分配的值所指定的值的百分比(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

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

-XX:G1HeapRegionSize = size

设置使用垃圾优先(G1)收集器时Java堆所细分的区域的大小。该值可以介于1 MB和32 MB之间。默认区域大小根据堆大小以符合人体工程学的方式确定。

以下示例显示如何将细分的大小设置为16 MB:

-XX:G1HeapRegionSize =16米

-XX:+ G1PrintHeapRegions

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

-XX:G1ReservePercent = 百分比

设置保留为false上限的堆的百分比(0到50),以减少G1收集器升级失败的可能性。默认情况下,此选项设置为10%。

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

-XX:G1ReservePercent = 20

-XX:InitialHeapSize = size

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

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

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

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

-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 = 百分比

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

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

-XX:InitiatingHeapOccupancyPercent = 75

-XX:MaxGCPauseMillis = 时间

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

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

-XX:MaxGCPauseMillis = 500

-XX:MaxHeapSize = size

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

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

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

在Oracle Solaris 7和Oracle Solaris 8 SPARC平台上,此值的上限约为4,000 MB减去间接费用金额。在Oracle Solaris 2.6和x86平台上,上限约为2,000 MB减去间接费用金额。在Linux平台上,上限约为2,000 MB减去间接费用金额。

该-XX:MaxHeapSize选项相当于-Xmx。

-XX:MaxHeapFreeRatio = 百分比

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

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

-XX:MaxHeapFreeRatio = 75

-XX:MaxMetaspaceSize = size

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

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

-XX:MaxMetaspaceSize =256米

-XX:MaxNewSize = size

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

-XX:MaxTenuringThreshold = threshold

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

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

-XX:MaxTenuringThreshold = 10

-XX:MetaspaceSize = size

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

-XX:MinHeapFreeRatio = 百分比

设置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) - 年龄1:28992024字节,28992024总计 - 年龄2:1366864字节,30358888总计 - 年龄3:1425912字节,31784800总计 ...

1岁对象是最年轻的幸存者(它们是在之前的清除之后创建的,在最近的清除中幸存下来,并从伊甸园迁移到幸存者空间)。2岁的物体在两次清除中幸存下来(在第二次清除期间,它们被从一个幸存者空间复制到下一个幸存者空间)。等等。

在前面的示例中,28 992 024个字节在一次清除中幸存,并从eden复制到幸存者空间,1 366 864个字节由2岁对象占用,等等。每行中的第三个值是年龄n的对象的累积大小或减。

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

-XX:+ ScavengeBeforeFullGC

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

-XX:SoftRefLRUPolicyMSPerMB = 时间

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

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

-XX:SoftRefLRUPolicyMSPerMB = 2500

-XX:StringDeduplicationAgeThreshold = threshold

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

JDK8部分JVM参数说明(二)

-XX:SurvivorRatio = 比率

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

-XX:SurvivorRatio = 4

-XX:TargetSurvivorRatio = 百分比

设置年轻垃圾收集后使用的幸存者空间(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建议您在spam(-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上花费的时间比例。默认情况下,此选项处于启用状态,OutOfMemoryError如果将超过98%的总时间花在垃圾回收上并且回收的堆少于2%,则并行GC将抛出该选项。当堆很小时,此功能可用于防止应用程序长时间运行,几乎没有进展。要禁用此选项,请指定-XX:-UseGCOverheadLimit。

-XX:+ UseNUMA

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

-XX:+ UseParallelGC

允许使用并行清除垃圾收集器(也称为吞吐量收集器),通过利用多个处理器来提高应用程序的性能。

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

-XX:+ UseParallelOldGC

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

-XX:+ UseParNewGC

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

-XX:+ UseSerialGC

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

-XX:+ UseSHM

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

有关更多信息,请参阅“大页面”。

-XX:+ UseStringDeduplication

启用字符串重复数据删除。默认情况下,禁用此选项。要使用此选项,必须启用垃圾优先(G1)垃圾收集器。请参阅-XX:+UseG1GC选项。

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

-XX:+ UseTLAB

允许在年轻代空间中使用线程局部分配块(TLAB)。默认情况下启用此选项。要禁用TLAB,请指定-XX:-UseTLAB。

已弃用和已删除的选项

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

-Xincgc

启用增量垃圾收集。此选项在JDK 8中已弃用,无需替换。

-Xrun libname

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

-XX:CMSIncrementalDutyCycle = 百分比

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

-XX:CMSIncrementalDutyCycleMin = 百分比

设置次要集合之间的时间百分比(0到100),它-XX:+CMSIncrementalPacing是启用时占空比的下限。在弃用选项后,此选项在JDK 8中已弃用,没有替换-XX:+CMSIncrementalMode。

-XX:+ CMSIncrementalMode

启用CMS收集器的增量模式。此选项在JDK 8中已弃用,没有替换,以及其他选项CMSIncremental。

-XX:CMSIncrementalOffset = 百分比

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

-XX:+ CMSIncrementalPacing

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

-XX:CMSIncrementalSafetyFactor = 百分比

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

-XX:CMSInitiatingPermOccupancyFraction = 百分比

设置启动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中删除,无需替换。

====================================

转自fr: https://www.cnblogs.com/syuf/p/10183683.html

多谢。

====================================

鲲鹏

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深度学习框架(如:Pytorch、Tensorflow、Caffe...)
下一篇:专访《构建之法——现代软件工程(第三版)》作者邹欣
相关文章