文章目录

  • 前情提要
  • 基础概念
  • 什么是JVM调优
  • 根据需求进行JVM规划和预调优
  • 优化运行JVM运行环境(慢,卡顿)
  • 系统CPU经常100%,如何调优?
  • 系统内存飙高,如何查找问题?
  • 监控JVM
  • 解决JVM运行过程中出现的各种问题(OOM)


前情提要

java程序响应时快时慢 应用响应慢 jvm_响应时间

基础概念

吞吐量:用户代码时间 /(用户代码执行时间 + 垃圾回收时间)
响应时间:STW越短,响应时间越好

  • 吞吐量优先场景:科学计算、数据挖掘
  • 响应时间优先场景:网站页面、API提供

什么是JVM调优

jvm调优一般可以分为以下3点:

  1. 根据需求进行JVM规划和预调优
  2. 优化运行JVM运行环境(慢,卡顿)
  3. 解决JVM运行过程中出现的各种问题(OOM)

根据需求进行JVM规划和预调优

  1. 明确业务场景,吞吐量优先还是响应时间优先
  1. 响应时间优先(CMS、G1)
  2. 吞吐量优先(PS+PO)
  1. 计算内存需求
  2. 垃圾收集器与内存大小关系(经验)
    Serial - 100M以内
    PS - 100M 到 10G
    CMS - 20G
    G1 - 100G
    ZGC - 4T以内
  3. 根据业务场景和内存需求选定垃圾回收器组合
  4. 设置年轻代和老年代大小(一般默认就好)
  5. 设置GC日志参数,滚动日志或每天一个日志
  6. 观察日志

优化运行JVM运行环境(慢,卡顿)

系统CPU经常100%,如何调优?

CPU100%那么一定有线程在占用系统资源。
处理流程

  1. 使用 top 命令,找到CPU占用高的进程
  2. 使用 top -H -p 命令,查看该进程中哪个线程占用CPU高
  3. 将线程id转化为16进制,结合进程号和线程号,利用jstack显示出错的堆栈信息
jstack -l <pid> | grep <thread-hex-id> -A 10
  1. 根据堆栈信息定位

系统内存飙高,如何查找问题?

  1. 配置JVM启动参数 -XX:+HeapDumpOnOutOfMemoryError 或 手动导出堆内存
  2. 使用(jhat、jvisualvm、MAT、jprofiler(收费))分析

监控JVM

推荐一个比较好用的阿里开源的工具:arthas

解决JVM运行过程中出现的各种问题(OOM)

解决OOM问题与系统内存飙高解决思路一致,获取dump文件,分析之。

  1. 使用jmap导出dump文件。不过线上系统内存特别大的时候,jmap执行期间会对进程产生很大影响,甚至卡顿。如果条件允许(做了集群),可以先停掉这台服务器,然后执行jmap导出dump文件。
  2. 虚拟机启动时指定 -XX:+HeapDumpOnOutOfMemoryError 参数,抛出 OutOfMemoryError 时, 会自动执行堆转储。
  3. 使用arthas在线定位