JMM
其实就是工作内存和主内存之间的交互
JVM
线程栈
方法区
对象头
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。
解决方法如下,把年轻代调大: