JVM 调优

JMM

3级缓存

JMM数据原子操作

其实就是工作内存和主内存之间的交互

JVM

JMM

线程栈

栈结构

方法区

对象头

32位对象头

64位的话:

64位对象头

锁升级

jvm默认延时4s自动开启偏向锁,可通过 -XX:BiasedLockingStartupDelay=0 取消延时,如果不要偏向锁,可通过-XX:-UserBiasedLocking = false 来设置

重量级锁的指针指向monitor

jvisualvm

在cmd输入jvisualvm回车就会打开可视化界面。

arthas

官网下载arthas的jar包。

java -jar arthas-boot.jar
//会看到存在的java进程,输入序号进入进程
dashboard

看到线程0占用了90%的cpu,明显有问题。输入thread+id号进入线程:

thread 8

然后去代码里找第39行:

反编译:

jad XXX.ArthasTest

调优案例

动态对象年龄判定

虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

比如如下设置:

60MB对象放入幸存者区触发动态对象年龄判定,直接进入老年代,导致频繁full gc。

解决方法如下,把年轻代调大:


   转载规则


《JVM 调优》 锦泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录