JVM调优案例的场景
- 为什么要调优:防止或者解决jvm虚拟机中的OOM问题;减少FullGC出现的频率,解决系统运行卡、慢问题
- JVM调优案例的四个方面
- OOM(堆溢出):java heap space
- OOM(元空间溢出):Metaspace
- OOM(GC overhead limit exceeded):超过98%的时间用来做GC,并且回收了不到2%的堆内存时会抛出此异常
- OOM(线程溢出):创建了大量线程导致的异常
- jvm调优监控的依据
- 运行日志
- 异常堆栈
- GC日志
- 线程快照
- 堆转储快照
- 出现的问题
- GC频繁
- CPU load过高
- OOM内存溢出
- 内存泄漏
- 死锁
- 程序响应时间长
- 性能分析
- GC日志分析
- jstack、jmap、jinfo等系统工具排查
- dump文件,使用内存分析工具分析,如visualvm、MAT
- jstack查看堆栈信息
- arthas实时监控jvm状态
JVM性能优化案例
- 调整堆内存大小提高服务的吞吐量
- JIT即时编译器优化:只要开启了逃逸分析,就会判断方法中的变量是否发生了逃逸,如果发生了逃逸,就会使用栈上分配;同步消除;标量替换
- 合理配置堆内存大小:一般设置为FullGC之后的老年代内存占用的3-4倍,方法区设置为1.2-1.5倍,年轻代设置为1-1.5倍
- cpu占用很高排查方案:top -Hp <进程pid>查看cpu不断飙高的异常线程pid,使用jstack查看该线程的执行情况(jstack <pid> | grep -A<N> 0x<16进制pid>)
- G1并发GC线程数对性能的影响
- 调整垃圾回收器提高服务的吞吐量
- 日均百万级订单交易系统如何设置jvm参数