开关
- -XX:+UnlockExperimentalVMOptions和-XX:+UnlockDiagnosticVMOptions
可解锁JVM额外参数。
性能
- -XX:MaxTenuringThreshold
MaxTenuringThreshold这个参数用于控制对象能经历多少次Minor GC才晋升到旧生代
默认值是15
- -XX:+-UseSpinning
自旋锁开启/关闭
Java1.4.2和1.5需要手动启用, Java1.6默认已启用
- -XX:PreBlockSpin
控制多线程自旋锁优化的自旋次数
默认10
JDK1.7后,去掉此参数,由jvm控制
JVM本身的一些优化
1.如果平均负载小于CPUs则一直自旋
2.如果有超过(CPUs/2)个线程正在自旋,则后来线程直接阻塞
3.如果正在自旋的线程发现Owner发生了变化则延迟自旋时间(自旋计数)或进入阻塞
4.如果CPU处于节电模式则停止自旋
5.自旋时间的最坏情况是CPU的存储延迟(CPU A存储了一个数据,到CPU B得知这个数据直接的时间差)
6.自旋时会适当放弃线程优先级之间的差异
- -XX:+-UseBiasedLocking
偏向锁开启/关闭
Java1.5 update 6后引入默认关闭。Java1.6默认启用。
- -XX:BiasedLockingStartupDelay=0
偏向锁用程序启动几秒钟之后才激活,启动偏向锁可以配合这个参数,关闭延迟。
- -server -XX:+DoEscapeAnalysis -XX:+EliminateLocks
参数在jvm为server模式下配合使用,可以开启锁消除,对于无竞争锁,jvm会自动消除锁。
-XX:+DoEscapeAnalysis 表示开启逃逸分析,分析对象作用域不会逃逸出某个作用域。
-XX:+EliminateLocks 表示锁消除
- -XX:+-Inline
开关参数。可开启方法内联。
方法内联是一种有效的优化手段,他可以减少调用的次数,从而提高系统性能。JIT编译器默认会进行方法内联优化。
参数名 默认值 说明
-XX:InlineSmallCode 2000 如果目标方法已被编译,且其生成的机器码大小超过该值,则无法内联
-XX:MaxTrivialSize 6 如果方法的字节码大小少于该值,则直接内联
-XX:MinInliningThreshold 250 如果目标方法的调用次数低于该值,则无法内联
-XX:MaxInlineSize 35 如果非热点方法的字节码大小超过该值,则无法内联
-XX:FreqInlineSize 325 如果热点方法的字节码大小超过该值,则无法内联
-XX:LiveNodeCountInliningCutoff 40000 编译过程中IR节点数目的上限
- -XX:AutoBoxCacheMax
修改Integer最大缓存值
默认128
- -XX:+EliminateAllocations
开关参数。若开启此参数,则将允许将对象打散分配在栈上,比如若一个对象拥有两个字段,会将这两个字段视作局部变量进行分配。
- -XX:CompileThreshold
热点代码编译阈值。Client模式下默认1500次。Server模式下默认10000次。
- -XX:+-TieredCompilation
开关参数。多级编译器策略。
必须在server模式下使用。
JVM中的JIT编译器分为客户端编译器和服务端编译器,一般称为C1和C2编译器。client模式下会使用C1编译器,server模式下会使用C2编译器。C1编译器的编译速度快,C2编译器编译时会有更多优化因此编译时间比C1长。为了使C1和C2编译速度和执行效率之间获取一个平衡,虚拟机支持一种多级编译的策略。共分为五级:
0级(解释执行):采用解释执行,不采集性能监控数据
1级(简单的C1编译):采用C1编译器,进行最简单的快速编译,根据需要采集性能数据
2级(有限的C1编译):采用C1编译器,进行更多的优化编译,可能会根据第1级采集的性能统计数据,进一步优化编译代码
3级(完全C1编译):完全使用C1编译器的所有功能,会采集性能数据进行优化。
4级(C2编译):完全使用C2进行编译,进行完全的优化。
内容来源:《实战Java虚拟机:JVM故障诊断与性能优化》--JDK1.8
- -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
JDK10以后两个参数同时使用,可以将JIT编译器的C2替换为Graal
- --XX:ReservedCodeCacheSize
字节码缓存区大小。
JIT编译器编译后的机器码保存在内存中,他的大小由此参数控制。一旦代码缓存耗尽,JIT就会停止,并且在整个虚拟机的声明周期中,不会再启动了。
在JConsole--内存--内存池(Code Cache)中可以图形化查看此空间使用情况。
内容来源:《实战Java虚拟机:JVM故障诊断与性能优化》--JDK1.8
调试
- -XX:+PrintGC
输出GC日志
- -XX:+PrintGCDetails
输出GC的详细日志
- -XX:HeapDumpOnOutOfMemoryError
开关参数,如果开启此参数。当发生OutOfMemoryError时,会输出堆的内存快照
- -XX:HeapDumpPath
配合前一个参数(XX:HeapDumpOnOutOfMemoryError)使用。指定输出堆内存快照存储的文件。
持续更新中...ing。