• 记一次linux通过jstack定位CPU使用过高问题或排查线上死锁问题


    一、java定位进程

    在服务器中终端输入命令:top

    可以看到进程ID,为5421的cpu这列100多了。

    记下这个数字:5421

    二、定位问题进程对应的线程

    然后在服务器中终端输入命令:top -Hp 5421

    作用是查看里程内部线程资源占用情况。5421为第二步获取到的进程id

     可以看到第一行cpu占用特别高,就是它了。记住,此时第一列PID是线程ID:5463

    注意这个ID是十进制,但是java线程堆栈是采用是16进制。那么我们转换一下。

    printf "%x " 5463

    输出结果:

    1557

    三、通过jstack命令找到线程对应代码

    现在我们需要用到之前的进程ID(5421)和线程的16进制数字(1557)。

    在服务器中终端输入命令:jstack -l 5421|grep 1557 -C 8

    可看到线程处于运行状态,代码在BugDemoController类的17行,也就是我们的循环所在行。

    这里解释一下grep后页-C 8意思是显示查找目标行的前后8行,不加的话就只有一行,可能一时看不出问题来。

    当然你也可以更改一下:

    -A 8后8行

    -B 8前8行

    PS:本例方法也可用于排查线上死锁问题。

  • 相关阅读:
    Linux 磁盘与文件系统管理
    mysql join
    iostat
    解决TIME_WAIT过多问题
    mysql 数据库性能追踪与分析
    CHECKPOINT
    DTRACE -MYSQL
    ORCLE INNODB 博客与 innodb_lru_scan_depth
    innodb 变量
    mysql博客
  • 原文地址:https://www.cnblogs.com/qjm201000/p/11062919.html
Copyright © 2020-2023  润新知