JVM调优实战

JVM调优实战

1.常用命令

  1. jps

    jps -ml

    显示java进程信息

  2. jinfo 进程号

    显示这个进程的运行的java程序的信息

  3. jstat -gc 进程号

    显示内存每块区域占用的大小

    jstat -gcutil 进程号

    显示内存每块区域占用的百分比大小

    jstat -gc 进程号 时间

    每 时间(ms)显示当前内存每块区域占用的大小

  4. jstack 进程号

    显示进程号里所有的线程信息

  5. jmap

    • jmap命令会STOP THE WORLD停止整个jvm内存情况保持不变。导致程序卡死(直接查看还是生成dump文件都会卡死),不能在线上使用啊!!!!

    jmap -histo 进程号

    生产当前jvm所有对象的 创建数量 和 占用内存数量

    jmap -histo 进程号 | head -20 显示前20行

    (可以不断查看,发现哪些对象在GC后还一直加,无法回收)

    jmap -dump:format=b,file=20241117.hprof 进程号

    生成内存情况转储文件20241117.hprof,用工具去分析

    jmap -histo 进程号 | head -20 | awk '{ print($1, $2, $3, $3/1024/1024, $4) }'
    变成以MB为单位 $3/1024/1024
    jmap -histo 进程号 | head -20 | awk '{ printf("%-10s %-10s %-10s %-10s %-10s\n", $1, $2, $3, $3/1024/1024, $4) }'
    结果格式化

系统级别的命令

  1. top

    显示所有进程的CPU和内存占用情况

    运行top后按大键盘1看看,可以显示每个cpu的使用率,top里显示的是把所有使用率加起来。
    注意:
    按下1后显示的是逻辑cpu的个数,并不代表cpu的真实核数。

    附录一:查看CPU核数、查看CPU型号 (https://blog.csdn.net/wngpenghao/article/details/126102303)

  2. top -Hp 进程号

    显示进程号的所有的线程CPU和内存占用情况

2.实战

假如JVM占用很高的CPU,怎么查问题出在哪里?

  1. 先用top命令 找出哪个进程cpu占用最高

  2. 再用top -Hp 进程号 找出哪个线程cpu占用最高pid pid是十进制 转成十六进制和下面stack的nid对应

  3. jstack 进程号查看所有线程信息,找到刚刚cpu占用最高的线程对应的信息 nid=0x9d85

  4. 判断这个线程类型

    • VM线程(GC线程):应该是不断 Full GC,频繁占用CPU,看GC日志,确认是否是这样?
      • 为什么不断GC?内存太小?内存泄漏?
    • 业务线程:看业务线程调用了哪些方法?不断循环占用内存?
  5. FUll GC是否正常:

    • 假如回收前200M,回收后就是1M,回收了199M,这样是正常的。因为客户端来的流量太大了,就应该去回收。

      • 这时应该去扩大内存
    • 每次回收就几k,那就是有问题,去生成dump文件分享

  6. 使用jvisualvm进行dump分析

3.Arthas

Arthas命令

  1. dashboard
  2. heap dump
  3. thread
  4. jvm
  5. jad
  6. redefine
  7. trace
posted @   deyang  阅读(28)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示