https://zhuanlan.zhihu.com/p/341374302
启用积极的性能优化功能, 这些功能有望在以后的版本中成为默认功能. 默认情况下, 此选项处于禁用状态, 并且不使用实验性能功能
设置要在实例分配指针之前预取的行数
默认情况下, 要预取的行数设置为1
-XX:AllocateInstancePrefetchLines=1
仅Java HotSpot Server VM支持此选项
设置对象分配的预取距离的大小(以字节为单位)
从最后分配的对象的地址开始,预取将要用新对象的值写入的内存直到该距离
每个Java线程都有自己的分配点
负值表示根据平台选择预取距离
正值是要预取的字节
字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节
默认值设置为-1
以下示例显示如何将预取距离设置为1024字节
-XX:AllocatePrefetchDistance=1024
仅Java HotSpot Server VM支持此选项
将预取指令设置为在分配指针之前进行预取
可能的值是0到3. 这些值后面的实际说明取决于平台
默认情况下, 预取指令设置为0
-XX:AllocatePrefetchInstr=0
仅Java HotSpot Server VM支持此选项
使用编译代码中生成的预取指令, 设置在最后一次分配对象后要加载的缓存行数
如果最后分配的对象是实例, 则默认值为1
如果它是数组, 则默认值为3
下面的示例显示如何将已加载的缓存行数设置为5
-XX:AllocatePrefetchLines=5
仅Java HotSpot Server VM支持此选项
设置顺序预取指令的步长(以字节为单位)
字母k或K表示千字节, m或M表示兆字节, g或G表示千兆字节
默认情况下, 步长设置为16个字节
-XX:AllocatePrefetchStepSize=16
仅Java HotSpot Server VM支持此选项
设置预取指令的生成代码样式
style参数是从0到3的整数
0: 不要生成预取指令
1: 每次分配后执行预取指令. 这是默认参数
2: 使用线程本地分配块(TLAB)水印指针来确定何时执行预取指令
3: 在SPARC上使用BIS指令进行分配预取
仅Java HotSpot Server VM支持此选项
启用后台编译. 默认情况下启用此选项
要禁用后台编译, 请指定 -XX:-BackgroundCompilation(等同于指定 -Xbatch )
设置用于编译的编译器线程数
默认情况下, server JVM的线程数设置为2, clientJVM的线程数设置为1, 如果使用分层编译, 则线程数将缩放为内核数
下面的示例显示如何将线程数设置为2
-XX:CICompilerCount=2
设置编译所需的最小可用空间(以字节为单位)
字母k或K表示千字节, m或M表示兆字节, g或G表示千兆字节
当剩余空间少于最小可用空间时, 编译将停止
默认情况下, 此选项设置为500 KB
下面的示例显示如何将最小可用空间设置为1024 MB
-XX:CodeCacheMinimumFreeSpace=1024m
指定要对方法执行的命令
例如, 要从编译类中排除String类的indexOf() 方法, 请使用以下命令
-XX:CompileCommand=exclude,java/lang/String.indexOf
请注意, 将指定完整的类名, 包括所有用斜杠(/)分隔的包和子包
简化粘贴操作, 也可以使用 -XX:+PrintCompilation 和 -XX:+LogCompilation 选项生成的方法名称格式
-XX:CompileCommand=exclude,java.lang.String::indexOf
如果指定的方法没有签名, 则该命令将应用于具有指定名称的所有方法
然而, 您还可以以类文件格式指定方法的签名
在这种情况下, 应将参数括在引号中, 否则会将分号视为命令结尾
例如, 如果要仅排除String类的indexOf(String) 方法, 请使用以下命令
-XX:CompileCommand="exclude,java/lang/String.indexOf,(Ljava/lang/String;)I"
您也可以使用星号 (*) 作为类和方法名称的通配符
例如, 要从所有类中排除所有类中的所有indexOf() 方法, 请使用以下命令
-XX:CompileCommand=exclude,*.indexOf
逗号和句点是空格的别名, 这使得通过外部传递编译器命令更加容易
您可以通过将参数用引号引起来, 将参数使用空格作为分隔符传递给 -XX:CompileCommand
-XX:CompileCommand="exclude java/lang/String indexOf"
请注意, 在使用 -XX:CompileCommand 选项解析在命令行上传递的命令之后, JIT编译器然后从
hotspot_compiler文件读取命令. 您可以使用 -XX:CompileCommandFile 选项将命令添加 到此文件或指定其他文件
要添加多个命令, 请多次指定 -XX:CompileCommand 选项, 或使用换行符 (\n) 分隔每个参数. 可以使用以下命令
break: 在调试JVM时设置一个断点, 以在指定方法的编译开始时停止
compileonly: 除了指定的方法外, 从编译中排除所有方法. 或者可以使用-XX:CompileOnly选项, 该选项允许指定几种方法
dontinline: 防止内联指定方法。
exclude: 从编译中排除指定的方法。
help: 打印 -XX:CompileCommand 选项的帮助消息。
inline: 尝试内联指定的方法
log: 对于指定方法以外的所有方法, 排除编译日志记录(使用-XX:+LogCompilation选项) 默认情况下将对所有编译方法执行日志记录。
option: 该命令可用于将JIT编译选项传递给指定的方法, 以代替最后一个参数(option). 编译选项设置在方法名称之后的末尾. 例如要为StringBuffer类的append() 方法启用BlockLayoutByFrequency选项,请使用以下命令:
-XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency
您可以指定多个编译选项, 以逗号或空格分隔
print: 在编译指定方法之后, 打印生成的汇编代码
quiet: 不要打印编译命令. 默认情况下将显示使用-XX:CompileCommand选项指定的命令. 例如, 如果您从编译中排除String类的indexOf() 方法, 则将以下内容输出到标准输出
CompilerOracle: exclude java/lang/String.indexOf
您可以通过在其他-XX:CompileCommand选项之前指定-XX:CompileCommand=quiet选项来抑制此情况
设置从中读取JIT编译器命令的文件
默认情况下, .hotspot_compiler文件用于存储由JIT编译器执行的命令
命令文件中的每一行代表一个命令, 一个类名和一个使用该命令的方法名
例如以下行为String类的toString() 方法打印汇编代码
print java/lang/String toString
有关指定JIT编译器在方法上执行的命令的更多信息, 请参见-XX:CompileCommand选项
设置应限制编译的方法列表(以逗号分隔), 仅指定的方法将被编译
用完整的类名指定每个方法(包括程序包和子程序包)
例如要仅编译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
设置编译之前解释的方法调用的次数
默认情况下, 在serverJVM中JIT编译器执行10,000个解释方法调用, 以收集信息以进行有效的编译
对于cenlitJVM, 默认设置为1,500次调用
启用分层编译时, 将忽略此选项;请参阅选项 -XX:+TieredCompilation
下面的示例显示如何将解释的方法调用数设置为5,000
-XX:CompileThreshold=5000
通过指定-Xcomp选项可以在编译之前完全禁用Java方法的解释
启用转义分析能力
默认情况下启用此选项
要禁用转义分析的使用,请指定 -XX:-DoEscapeAnalysis
仅Java HotSpot Server VM支持此选项
设置初始代码缓存大小(以字节为单位)
字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节
默认值设置为500 KB
初始代码高速缓存大小应不小于系统的最小内存页面大小
下面的示例显示如何将初始代码缓存大小设置为32 KB
-XX:InitialCodeCacheSize=32k
启用方法内联
默认情况下启用此选项以提高性能
要禁用方法内联,请指定 -XX:-Inline
设置应内联的已编译方法的最大代码大小(以字节为单位)
字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节
仅大小小于指定大小的已编译方法才会被内联
默认情况下,最大代码大小设置为1000字节
-XX:InlineSmallCode=1000
允许将编译运行记录到当前工作目录中名为hotspot.log的文件中
您可以使用 -XX:LogFile 选项指定其他日志文件路径和名称
默认情况下,此选项为禁用状态,并且不记录编译活动
-XX:+LogCompilation 选项必须与 -XX:+UnlockDiagnosticVMOptions选项一起使用,该选项可解锁诊断JVM选项
每次使用-XX:+PrintCompilation选项编译方法时,都可以使用打印到控制台的消息来启用详细的诊断输出
设置要内联方法的最大字节码大小(以字节为单位)
字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节
默认情况下,最大字节码大小设置为35个字节
-XX:MaxInlineSize=35
设置在单个方法编译期间要使用的最大节点数
默认情况下,最大节点数设置为65,000
-XX:MaxNodeLimit=65000
设置要内联的简单方法的最大字节码大小(以字节为单位)
字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节
默认情况下,简单方法的最大字节码大小设置为6个字节
-XX:MaxTrivialSize=6
启用字符串连接操作的优化
默认情况下启用此选项
要禁用字符串连接操作的优化,请指定 -XX:-OptimizeStringConcat
仅Java HotSpot Server VM支持此选项
通过使用外部disassembler.so库,可以打印字节码和本机方法的汇编代码
使您能够查看生成的代码,这可以帮助您诊断性能问题
默认情况下,此选项为禁用状态,并且不打印汇编代码
-XX:+PrintAssembly 选项必须与 -XX:+UnlockDiagnosticVMOptions 选项一起使用,该选项可解锁诊断JVM选项
每次编译方法时,通过将消息打印到控制台来启用JVM的详细诊断输出
这使您可以查看实际编译了哪些方法
默认情况下,此选项为禁用状态,并且不打印诊断输出
您还可以使用 -XX:+LogCompilation 选项将编译活动记录到文件中
启用内联决策的打印。这使您可以查看要内联的方法
默认情况下,此选项为禁用状态,并且不打印内联信息
必须将 -XX:+PrintInlining 选项与用于解锁诊断JVM选项的 -XX:+UnlockDiagnosticVMOptions选项一起使用
设置JIT编译的代码的最大代码缓存大小(以字节为单位)
字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节
默认的最大代码缓存大小为240 MB; 如果使用选项 -XX:-TieredCompilation 禁用分层编译,则默认大小为48 MB
此选项的限制为2 GB; 否则,将产生错误
最大代码缓存大小应不小于初始代码缓存大小;请参阅选项 -XX:InitialCodeCacheSize。此选项等效于-Xmaxjitcodesize
RTM中止比率指定为所有已执行RTM事务的百分比(%)
如果中止的事务数量大于该比率,则将对编译后的代码进行优化
启用 -XX:+ UseRTMDeopt 选项时,将使用此比率。此选项的默认值为50
这意味着,如果所有事务中有50%被中止,则将对编译后的代码进行优化
在中止或繁忙时,RTM锁定代码将重试此选项指定的次数,然后再退回到正常的锁定机制
此选项的默认值为5。-XX:UseRTMLocking 选项必须启用
禁用分层编译
默认情况下,启用此选项
仅Java HotSpot Server VM支持此选项
为Intel,AMD和SPARC硬件启用基于硬件的AES内部函数
支持的硬件包括Intel Westmere(2010和更高版本), AMD Bulldozer(2011和更高版本)和SPARC(T4和更高版本)
UseAES与UseAESIntrinsics结合使用
UseAES和UseAESIntrinsics标志在默认情况下处于启用状态,并且仅对32位和64位Java HotSpot Server VM支持
要禁用基于硬件的AES内在函数,请指定 -XX:-UseAES -XX:-UseAESIntrinsics
例如,要启用硬件AES,请使用以下标志
-XX:+UseAES -XX:+UseAESIntrinsics
要为32位和64位支持UseAES和UseAESIntrinsics标志,请使用 -server 选项选择Java HotSpot Server VM
客户端VM不支持这些标志
在关闭编译器之前启用对代码缓存的刷新
默认情况下启用此选项
要在关闭编译器之前禁用代码缓存的刷新,请指定-XX:-UseCodeCacheFlushing
启用在更新卡表之前检查卡是否已被标记的功能
默认情况下,此选项是禁用的,并且仅应在具有多个插槽的计算机上使用,它将提高严重依赖并发操作的Java应用程序的性能
仅Java HotSpot Server VM支持此选项
根据中止率自动调整RTM锁定
该比率由 -XX:RTMAbortRatio 选项指定
如果中止的事务数超过了中止比率,那么包含锁的方法将被优化,并将所有锁作为普通锁重新编译
默认情况下禁用此选项
必须启用 -XX:+UseRTMLocking 选项
使用常规锁定机制作为后备处理程序, 为所有膨胀的锁定生成受限事务存储(RTM)锁定代码
默认情况下禁用此选项. 与RTM相关的选项仅可用于支持事务同步扩展(TSX)的x86 CPU上的Java HotSpot Server VM
RTM是Intel TSX的一部分, TSX是x86指令集扩展, 有助于创建多线程应用程序
RTM引入了新的指令XBEGIN, XABORT, XEND和XTEST. XBEGIN和XEND指令包含了一组作为事务运行的指令
如果在运行事务时未发现冲突, 则在XEND指令中一起提交存储器和寄存器修改. XABORT指令可用于显式中止事务, 而XEND指令可用于检查一组指令是否正在事务中运行
当另一个线程尝试访问同一事务时, 对事务的锁定会被夸大, 从而阻塞了最初不请求访问该事务的线程. RTM要求指定备用操作集, 以防事务中止或失败. RTM锁是已委派给TSX系统的锁
RTM可以提高关键区域(冲突代码不能同时由多个线程访问)中冲突少的高竞争性锁的性能
RTM还提高了粗粒度锁定的性能, 这种性能通常在多线程应用程序中表现不佳( 粗粒度锁定是长时间持有锁的策略, 可最大程度地减少获取和释放锁的开销, 而细粒度锁定是通过仅在必要时锁定并尽快解锁来尝试实现最大并行度的策略)
对于不同线程使用的竞争激烈的锁, RTM可以减少错误的缓存行共享, 也称为缓存行ping-pong. 当来自不同处理器的多个线程正在访问不同的资源, 但是这些资源共享同一条缓存行时, 就会发生这种情况. 结果处理器反复使其他处理器的缓存行无效, 这迫使它们从主内存而不是其缓存中读取
为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
启用SHA-1加密哈希函数的内部函数
启用SHA-224和SHA-256加密哈希函数的内部函数
启用SHA-384和SHA-512加密哈希函数的内部函数
允许将标量运算转换为超级运算
默认情况下启用此选项
要禁用将标量运算转换为超级运算, 请指定
-XX:-UseSuperWord
仅Java HotSpot Server VM支持此选项