JVM 性能调优实战(1)
前言
各种实战,积累经验
将理论与工具融会贯通
- 额外的理论增补
- 额外的一些工具
预热:JVM参数选项
JVM参数选项繁多, 格式不一
- -开头
如 :java -version - -X开头
如 :java -Xmx50m - -XX开头…
如 :java -XX:+UseG1GC
JVM选项的分类与方式
1. 标准选项(Standard Options for Java)
1.1 作用
用于执行常见操作,例如检查JRE版本,设置类路径,启用详细输出等,各种虚拟机的实现都会去支持标准参数
1.2 查看支持的参数
java -help
1.3 使用格式
格式不统一,以java -help的结果为准
1.4 使用示例
java -version
java -agentlib:jdwp=help
java --show-version
1.5 常用标准选项
TIPS
完整的标准选项详见:
JDK 11: Standard Options for Java
JDK 8: Standard Options
- –class-path classpath, -classpath classpath, or -cp classpath
通知JVM类搜索路径。如果指定了-classpath,则JVM就忽略CLASSPATH中指定的路径。各路径之间以分号隔开。如果-classpath和CLASSPATH都没有指定,则VM从当前路径寻找class - -server
以server模式启动JVM,与client情况恰好相反。适合生产环境,适用于服务器。64位的JVM自动以server模式启动 - -client :
以client模式启动JVM,这种方式启动速度快,但运行时性能和内存管理效率不高,适合客户端程序或者开发资源, - D -Dproperty=value
设置系统属性值。其中,property 是属性名称,value 是属性的值,如果value有空格,则需要使用双引号,例如-Dfoo=”foo bar" - -javaagent:jarpath[=options]
加载指定的Java编程语言代理 - -verbose:class
显示类加载相关的信息,当报找不到类或者类冲突时可用此参数诊断 - -verbose:gc
显示垃圾收集事件的相关信息 - -verbose:jni
显示本机方法和其他Java本机接口UNI) 的相关信息 - –version
展示JDK版本(打印到错误流error stream) - -version
展示JDK版本(打印到输出流out stream)
2. 附加选项(Extra Options for Java)
TIPS
● 额外参数(Extra Options for Java), 是JDK 11文档中的说法。jDK 8的文档将额外参数称之为“非标准参数(Non-Standard Options)",但可以理解为是一个东西,只是改了个名而已。
2.1 作用
HotSpot虛拟机的通用选项,其他厂牌的JVM不一定会支持这些选项,并且在未来可能会发生变化。这些选项以-X开头。
2.2 查看支持的参数
java -X
2.3使用格式
大部分附加选项的格式都是-X属性名,例如EXcomp,但也有例外,比如-Xmx500m。 具体可参考java -X的输出
2.4使用示例
java -Xmx80m
java -Xint
2.5常用附加选项.
TIPS
完整的附加选项详见:
● JDK 11: Extra Qptions for Java
● JDK 8: Non-Standard Options
● -Xcomp
在第一次调用时强制编译方法。默认情况下,client模式下会解释执行1000次(DK 11下),server模式下会解释执行10000次,并收集信息,此后才可能编译运行。指定该选项将禁用解释方法调用。此外,还可使用 -XX :CompileThreshold 选项更改在编译之前解释执行方法的调用次数
●- Xint
以解释模式运行
● -Xmixed
热点方法以编译模式运行,其他方法以解释模式运行
● -Xloggc:option
将GC事件的相关信息记录到文件中
● -Xnoclassgc
禁用类的垃圾收集。使用该参数可节省一些GC时间,缩短应用程序运行期间的停顿。但一旦使用该参数,那么应用程序中的类对象就会始终被视为活动对象,从而导致这块内存被永久占用。如果使用不当,将会导致内存溢出(out-of-memory exception)
● -Xshare:mode
设置类数据共享( class data sharing (CDS))模式。mode的取值如下:
- auto:尽可能使用CDS,32位Hotspot JVM默认值
- on:开启CDS。如果CDS无法被开启将会打印错误信息。
(注:此选项只应用于测试目的,并且可能由于操作系统使用地址空间布局随机化而导致间歇性故障,不应在生产c环境使用) - off: 不使用CDS
● -XshowSettings:category
展示所有设置。category取值如下:
- all: 展示所有设置(默认值)
- locale: 展示语言环境相关的设置
- properties: 展示系统属性相关的设置
- vm:展示jVM的设置
- system: 显示Linux主机系统或容器配置
● -Xmnsize ;
设置新生代的初始值及最大值,以字节为单位。也可在size后追加字母k或K表示千字节,m或M表示兆字节,或g或G表示千兆字节,例如-Xmn256m。此外,还可用-XX :NewSize设置新生代初始大小,-XX : MaxNewSize设置新生代最大大小
● -Xmssize
设置堆内存的初始大小,以字节为单位。此值必须是1024的倍数且大于1MB。如果未设置此选项,则将堆内存初始大小设为为老年代和新生代分配的大小之和。设置格式同Xmn,例如-Xms6144k。
● -Xmxsize
设置堆内存的最大大小,以字节为单位。此值必须是1024的倍数且大于2MB。等效于 -XX:MaxHeapSize。
● -Xsssize
设置线程栈大小,以字节为单位。将堆内存初始大小设为为老年代和新生代分配的大小之和。默认值取决于平台:
- Linux / x64 (64(位) : 1024 KB ,
- macOS (64位) : 1024 KB
- Orale Solaris/ x64 (64[1I) : 1024 KB
- Windows: 默认值 取决于虚拟内存
3. 高级选项(Advanced Options)
3.1 作用
高级选项是为开发人员提供的选项,用于调整Java HotSpot虚拟机操作的特定区域,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数的特权访问。其他厂牌的JVM不一-定会支持这些选项,并且在未来可能会发生变化。高级选项以-XX开头。
3.2 查看支持的参数
方式一:使用如下命令
java - :XX : +UnlockExperimentalVMOptions -XX : +UnlockDiagnosticVMOptions - XX: +Pr intFlagsInitial
其中:
● UnlockExperimentalVMOptions: 用于解锁实验性参数,如果不加该标记,不会打印实验性参数
● UnlockDiagnosticVMOptions: 用于解锁诊断性参数,如果不加该标记,不会打印诊断性参数
● PrintFlagsFinal: 打印支持的XX选项,并展示默认值。如需获得程序运行时生效值,用PrintFlagsFinal
方式二、使用jhsdb
jhsdb clhsdb --pid 进程号
然后输入 flags 去查看
3.3 使用格式
- 如果选项的类型是boolean:那么配置格式是一Xx:(+/-)选项 即可。+表示将选项设置为true, -表示设置为false,例如: -XX: +PrintGC
- 如果选项的类型不是boolean,那么配置格式是- XX:选项=值,例如: -XX :NewRatio=4
3.4 使用示例
- -XX: +Pr intGC
- -XX:NewRatio=4
3.5 JDK 11对高级选项的细分
●Advanced Runtime Options for Java :高级运行时选项,控制HotSpot VM的运行时行为
●Advanced J正Compiler Options for java :高级JIT编译器选项:控制HotSpot VM执行的JIT编译
●Advanced Serviceability Options for Java :高级可服务性选项:系统信息收集与调试支持
●Advanced Garbage Collection Options for Java :高级垃圾收集选项:控制HotSpot如何执行垃圾收集
3.6 JDK 8对高级选项的细分
●Advanced Runtime Qptions
●Advanced JICompiler Options
3.7常用高级选项
TIPS
完整的高级选项详见:
JDK 11
●Advanced Runtime Options for Java :控制HotSpot VM的运行时行为
●Advanced J工Compiler Options for java :控制HotSpot VM执行的JIT编译
●Advanced Serviceability Options for Java :系统信息收集与调试支持
●Advanced Garbage Collection Options for Java :控制HotSpot如何执行垃圾收集
3.7.1常用高级运行时选项
● -XX:ActiveProcessorCount=x
JVM使用多少个CPU核心去计算用于执行垃圾收集或ForkJoinPool线程池的大小
● -XX:InitiatingHeapOccupancyPercent=n
老年代大小达到该阈值,就触发Mixed GC,默认值为45
● -XX;LargePageSizeInBytes=size
设置用于Java堆的大页面尺寸。单位字节,数值必须是2的次幂。也可在size后追加字母k或K表示千字节,m或M表示兆字节,或g或G表示千兆字节
● -XX:MaxDirectMemorySize=size
设置java. nio包直接缓冲区分配的最大总大小。以字节为单位也可在size后追加字母k或K表示千字节,m或M表示兆字节,或g或G表示千兆字节
● -XX:MaxGCPauseMillis=ms
期望的最大停顿时间,默认值200ms
● -XX:OnError=string
发生错误时候做某事,string是- 个或多个命令,多个命令用;分隔,如果字符串包含空格,则必须将其用引号引起来。例如:
当发生错误时,使用gcore命令创建核心dump文件
-XX:OnError=“gcore %p;dbx - %p”
● -XX:OnOutOfMemoryError=string
当发生OutOfMemoryError异常时做某事。配置格式同-xX :OnError
●-XX:ParallelGCThreads=n
设置并行阶段的线程数
● -XX:+PrintCommandLineFlags
打印命令行标记,默认关闭
● -XX:ThreadStackSize=size
设置线程栈的大小,和-Xss等价
● -XX:-UseBiasedLocking
禁用偏向锁
● -XX:-UseCompressedOops
禁用压缩指针。默认情况下,启用此选项,并且当Java堆大小小于32 GB时,将使用压缩指针。启用此选项后,对象引用将表示为32位偏移量,而非64位指针,这通常会在运行Java堆大小小于32GB的应用程序时提高性能。此选项仅适用于64位JVM。当Java堆大小大于32 GB时,使用-XX:ObjectAl ignmentInBytes选项。
● -XX:GCL ogFileSize=number
处理大型日志文件,默认为512K
● -XX:+UseLargePages
启用大页面内存的使用,默认关闭
●-XX:VMOptionsFile=filename
允许用户在文件中指定VM选项。例如java -XX :VMoptionsFile=/var/my_ vm _options HelloWorld。
3.7.2常用高级JIT编译器选项
● -XX:+BackgroundCompilation
启用后台编译,默认开启
● -XX:CompileCommand=command,method[option]
在指定方法上执行指定command。command可选项:
- break:
在调试JVM时设置一个断点, 以便在指定方法编译开始时停止 - compileonly
排除所有未指定的所有方法。 - dontinline
防止内联指定方法 - exclude
排除指定的方法 - help
打印-XX: Compi leCommand选项的帮助消息。 - 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 javal lang/ String.indexOf
可通过- XX : Compi leCommand=quiet在其他- xx :CompileCommand选项之前指定该选项来抑制这种情况。
● -XX:+DoEscapeAnalysis
开启逃逸分析,默认开启
● -XX:+Inline
启用方法内联,默认开启
● -XX:InlineSmallCode=size
指定内联的已编译的方法的最大代码大小已字节为单位,默认1000字节
● -XX:+LogCompilation
将编译活动记录到当前工作目录的hotspot.log文件中,也可用-xX :LogFile选项指定其他日志文件路径和名称,默认关闭。该选项必须与-Xx: +UnlockDiagnosticVMoptions配合使用。
●-XX:MaxInlineSize=size
设置要内联的方法的最大字节码大小,以字节为单位
●-XX:+PrintAssembly
打印字节码和本地方法的汇编代码,需要hsdis的支持。默认禁用,该选项必须与-
XX:+UnlockDiagnosticVMoptions配合使用。
● -XX:+PrintCompilation
编译方法时,将消息打印到控制台来启用JVM的详细诊断输出,默认关闭。
● -XX:+ Printlnlining
打印哪些方法被内联。默认关闭,该选项必须与-XX : +UnlockDiagnost icVMOptions配合使用。
● -XX:ReservedCodeCacheSize=size
设置JIT编译的代码的最大代码缓存的大小,以字节为单位,默认是240MB,最大不超过2GB,否则会产生错误。另外,除非禁用分层编译,否则XX:-TieredCompilation默认大小为48 MB。该配置不应小于 -XX:InitialCodeCacheSize 的值。
3.7.3常用高级可服务性选项
● -XX:HeapDumpPath=path
指定堆Dump的文件路径,经常和-XX : +HeapDumpOnOutofMemoryError选项配合使用。默认情况下,HeapDumpPath可显式设置Dump文件的路径,例如:
-XX :HeapDumpPath=./java_ pidi%p.hprof
● -XX:LogFile=path
指定日志文件的路径,默认情况下文件在当前工作目录中创建,名为hotspot.log 。该选项经常和-XX:+LogCompilation配合使用。
● -XX:+UnlockDiagnosticVMOptions
解锁用于诊断JVM的选项,默认关闭
4. 不应使用的选项(obsolete, deprecated, and removed Options)
这部分选项都尽量不要去使用,这类选项:
JDK 11中可细分为:
●Deprecated Java Options :废弃的选项:使用这些参数时,JDK会接受并执行这些参数,但使用时会有警告
●Obsolete Java Options :淘汰的选项:使用这些参数时,JDK会接受这些参数,但会直接忽略(相当于加了也没效果),使用时会有警告
●Removed Java Options :删除的选项:使用这些参数时,会导致错误
JDK 8文档中未做细分。读者可自行前往
https://chriswhocodes.com/hotspet options_ jdk8.html搜索选项的状态。
参考文档
● https://docs.oracle.com/en/java/javase/11/tools/java.html
● https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
