文章目录
- 前情提要
- 基础概念
- 什么是JVM调优
- 根据需求进行JVM规划和预调优
- 优化运行JVM运行环境(慢,卡顿)
- 系统CPU经常100%,如何调优?
- 系统内存飙高,如何查找问题?
- 监控JVM
- 解决JVM运行过程中出现的各种问题(OOM)
前情提要
基础概念
吞吐量:用户代码时间 /(用户代码执行时间 + 垃圾回收时间)
响应时间:STW越短,响应时间越好
- 吞吐量优先场景:科学计算、数据挖掘
- 响应时间优先场景:网站页面、API提供
什么是JVM调优
jvm调优一般可以分为以下3点:
- 根据需求进行JVM规划和预调优
- 优化运行JVM运行环境(慢,卡顿)
- 解决JVM运行过程中出现的各种问题(OOM)
根据需求进行JVM规划和预调优
- 明确业务场景,吞吐量优先还是响应时间优先
- 响应时间优先(CMS、G1)
- 吞吐量优先(PS+PO)
- 计算内存需求
- 垃圾收集器与内存大小关系(经验)
Serial - 100M以内
PS - 100M 到 10G
CMS - 20G
G1 - 100G
ZGC - 4T以内 - 根据业务场景和内存需求选定垃圾回收器组合
- 设置年轻代和老年代大小(一般默认就好)
- 设置GC日志参数,滚动日志或每天一个日志
- 观察日志
优化运行JVM运行环境(慢,卡顿)
系统CPU经常100%,如何调优?
CPU100%那么一定有线程在占用系统资源。
处理流程
- 使用 top 命令,找到CPU占用高的进程
- 使用 top -H -p 命令,查看该进程中哪个线程占用CPU高
- 将线程id转化为16进制,结合进程号和线程号,利用jstack显示出错的堆栈信息
jstack -l <pid> | grep <thread-hex-id> -A 10
- 根据堆栈信息定位
系统内存飙高,如何查找问题?
- 配置JVM启动参数 -XX:+HeapDumpOnOutOfMemoryError 或 手动导出堆内存
- 使用(jhat、jvisualvm、MAT、jprofiler(收费))分析
监控JVM
推荐一个比较好用的阿里开源的工具:arthas
解决JVM运行过程中出现的各种问题(OOM)
解决OOM问题与系统内存飙高解决思路一致,获取dump文件,分析之。
- 使用jmap导出dump文件。不过线上系统内存特别大的时候,jmap执行期间会对进程产生很大影响,甚至卡顿。如果条件允许(做了集群),可以先停掉这台服务器,然后执行jmap导出dump文件。
- 虚拟机启动时指定 -XX:+HeapDumpOnOutOfMemoryError 参数,抛出 OutOfMemoryError 时, 会自动执行堆转储。
- 使用arthas在线定位