JVM参数学习

开关

  • -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.自旋时会适当放弃线程优先级之间的差异

内容来源:https://blog.csdn.net/zqz_zqz/article/details/70233767

  • -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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌拉乌拉liang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值