生产问题定位

  1. 排除应用之外的影响因素: top(cpu)、free(内存)、df(磁盘)、dstat(网络流量)、pstackvmstatst1race(底层系统调用)

  2. top 定位CPU 最高的进程

  3. top -Hp pid 定位使用 CPU 最高的线程(或者 ps -mp pid -o THREAD,tid,time

  4. printf '0x%x' tid 线程 id 转化 16 进制

  5. jstack pid | grep tid 找到线程堆栈

    5.1 gc线程(如下是查看gc情况的几种方式)

    👉🏿 查看gc 日志

    👉🏿 jstat -gcutil 进程号 统计间隔毫秒 统计次数(缺省代表一次统计)

    👉🏿 如果所在公司有对应用进行监控的组件当然更方便(比如Prometheus + Grafana)

    结合内存dump日志分析:

    1. 哪些对象导致的内存溢出导致频繁gc(尤其是full gc)

    2. 如果不是内存溢出导致频繁gc,也可能是代码或者第三方依赖的包中有显示的System.gc()调用,此时可以通过添加 -XX:+DisableExplicitGC来禁用JVM对显示GC的响应。

      在分配堆外内存的时候,内存不足时会显示的调用System.gc(),如果显示gc被禁用,则可能会导致堆外内存溢出,所以堆外内存的回收最好就不要依赖jvm,主动回收吧。

    5.2 业务线程

    👉🏿 关注线程堆栈的lock字段

    👉🏿 jstack -l pid | grep BLOCKED 查看阻塞态线程堆栈

版权

评论