[转帖]高级JIT编译器选项 Advanced JIT Compiler Options

高级,jit,编译器,选项,advanced,compiler,options · 浏览次数 : 0

小编点评

**使用硬件SHA加密函数的内部函数** ``` -XX:-UseSHA256Intrinsics-XX:+UseSHA1Intrinsics ``` **仅启用SHA-1加密哈希函数的内部函数** ``` -XX:-UseSHA256Intrinsics-XX:+UseSHA1Intrinsics ``` **仅启用SHA-224和SHA-256加密哈希函数的内部函数** ``` -XX:-UseSHA256Intrinsics-XX:+UseSHA225Intrinsics ``` **仅启用SHA-384和SHA-512加密哈希函数的内部函数** ``` -XX:-UseSHA256Intrinsics-XX:+UseSHA384Intrinsics ``` **仅启用SHA-384和SHA-512加密哈希函数的内部函数** ``` -XX:-UseSHA256Intrinsics-XX:+UseSHA512Intrinsics ``` **仅使用SuperWord功能** ``` -XX:-UseSuperWord ```

正文

https://zhuanlan.zhihu.com/p/341374302

 

-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

将预取指令设置为在分配指针之前进行预取

可能的值是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

设置用于编译的编译器线程数

默认情况下, server JVM的线程数设置为2, clientJVM的线程数设置为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

如果指定的方法没有签名, 则该命令将应用于具有指定名称的所有方法

然而, 您还可以以类文件格式指定方法的签名

在这种情况下, 应将参数括在引号中, 否则会将分号视为命令结尾

例如, 如果要仅排除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选项来抑制此情况


-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

设置编译之前解释的方法调用的次数

默认情况下, 在serverJVM中JIT编译器执行10,000个解释方法调用, 以收集信息以进行有效的编译

对于cenlitJVM, 默认设置为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:+Inline

启用方法内联

默认情况下启用此选项以提高性能

要禁用方法内联,请指定 -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=nodes

设置在单个方法编译期间要使用的最大节点数

默认情况下,最大节点数设置为65,000

-XX:MaxNodeLimit=65000

-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 选项必须与 -XX:+UnlockDiagnosticVMOptions 选项一起使用,该选项可解锁诊断JVM选项


-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标志在默认情况下处于启用状态,并且仅对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

在关闭编译器之前启用对代码缓存的刷新

默认情况下启用此选项

要在关闭编译器之前禁用代码缓存的刷新,请指定-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是Intel TSX的一部分, TSX是x86指令集扩展, 有助于创建多线程应用程序

RTM引入了新的指令XBEGIN, XABORT, XEND和XTEST. XBEGIN和XEND指令包含了一组作为事务运行的指令

如果在运行事务时未发现冲突, 则在XEND指令中一起提交存储器和寄存器修改. XABORT指令可用于显式中止事务, 而XEND指令可用于检查一组指令是否正在事务中运行

当另一个线程尝试访问同一事务时, 对事务的锁定会被夸大, 从而阻塞了最初不请求访问该事务的线程. RTM要求指定备用操作集, 以防事务中止或失败. RTM锁是已委派给TSX系统的锁

RTM可以提高关键区域(冲突代码不能同时由多个线程访问)中冲突少的高竞争性锁的性能

RTM还提高了粗粒度锁定的性能, 这种性能通常在多线程应用程序中表现不佳( 粗粒度锁定是长时间持有锁的策略, 可最大程度地减少获取和释放锁的开销, 而细粒度锁定是通过仅在必要时锁定并尽快解锁来尝试实现最大并行度的策略)

对于不同线程使用的竞争激烈的锁, RTM可以减少错误的缓存行共享, 也称为缓存行ping-pong. 当来自不同处理器的多个线程正在访问不同的资源, 但是这些资源共享同一条缓存行时, 就会发生这种情况. 结果处理器反复使其他处理器的缓存行无效, 这迫使它们从主内存而不是其缓存中读取


-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:+UseSHA512Intrinsic

启用SHA-384和SHA-512加密哈希函数的内部函数


-XX:+UseSuperWord

允许将标量运算转换为超级运算

默认情况下启用此选项

要禁用将标量运算转换为超级运算, 请指定

-XX:-UseSuperWord
仅Java HotSpot Server VM支持此选项

与[转帖]高级JIT编译器选项 Advanced JIT Compiler Options相似的内容:

[转帖]高级JIT编译器选项 Advanced JIT Compiler Options

https://zhuanlan.zhihu.com/p/341374302 -XX:+AggressiveOpts 启用积极的性能优化功能, 这些功能有望在以后的版本中成为默认功能. 默认情况下, 此选项处于禁用状态, 并且不使用实验性能功能 Java’s -XX:+AggressiveOpts:

[转帖]JVM参数:-XX:ReservedCodeCacheSize

通过笨神的分享整理笔记: 这个参数主要设置codecache的大小,比如我们jit编译的代码都是放在codecache里的,所以codecache如果满了的话,那带来的问题就是无法再jit编译了,而且还会去优化。因此大家可能碰到这样的问题:cpu一直高,然后发现是编译线程一直高(系统运行到一定时期)

[转帖]awk高级企业级使用案例

https://www.jianshu.com/p/e36176ad3c06 一、背景: 以某物联网企业,传感器设备实时数据消费服务(Kafka-consumer)为例,调试筛选处理耗时的主题。 1. 原始日志格式(logback输出的): 2018-07-11 11:49:22.413 INFO

【转帖】《MySQL高级篇》四、索引的存储结构

1. 为什么使用索引 假如给数据使用 二叉树 这样的数据结构进行存储,如下图所示 2、索引及其优缺点 2.1 索引概述 2.2 优点 类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的 IO 成本 这也是创建索引的主要的原因。通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性 (唯一

[转帖]Linux环境变量高级用法

https://www.cnblogs.com/apink/p/17049223.html 变量删除 设置方式功能 ${var#key} 从左往右查找key,删除最短匹配内容 ${var##key} 从左往右查找key,删除最长匹配内容 ${var%key} 从右往左查找key,删除最短匹配内容 $

[转帖]银河麒麟高级服务器操作系统V10SP1 - ISO镜像定制 + KickStart自动化安装

文章目录 一、基础环境搭建1. 原始ISO获取2. 系统安装 二、ISO镜像定制1. 准备工作2. 修改ISO镜像3. 生成ISO镜像; 三、ISO镜像验证 一、基础环境搭建 1. 原始ISO获取 OS版本:银河麒麟高级服务器操作系统V10SP1(X86_64) 百度网盘:https://pan.b

[转帖]银河麒麟高级服务器操作系统V10SP1安装Docker管理工具(Portainer+DockerUI)

文章目录 一、系统环境配置二、安装Docker三、安装Docker管理工具Docker管理工具之PortainerPortainer简介Portainer安装Portainer访问测试 Docker管理工具之DockerUIDockerUI简介DockerUI安装DockerUI访问测试 一、系统环

[转帖]Redis进阶实践之五Redis的高级特性

https://www.cnblogs.com/PatrickLiu/p/8341951.html 一、引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握。今天我们开始介绍一些Redis的高级特性,虽然

[转帖]Docker容器管理技术-高级网络管理

Docker容器管理技术-高级网络管理 https://www.jianshu.com/p/5859a2fe4377 1. Docker本地网络类型 1.1查看支持网络类型 docker network ls 1.2 测试使用各类网络类型 docker run network=xxx none :

[转帖]详解nginx的rewrite应用,Nginx高级之Rewrite规则

https://zhuanlan.zhihu.com/p/359801091 Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Nginx 前要编译安装 P