jstack找出占用cpu最高的线程堆栈信息

    1. package com.tuling.jvm;
    2. public class Math {
    3. public static final int initData = 666;
    4. public static User user = new User();
    5. public int compute() { //一个方法对应一块栈帧内存区域
    6. int a = 1;
    7. int b = 2;
    8. int c = (a + b) * 10;
    9. return c;
    10. }
    11. public static void main(String[] args) {
    12. Math math = new Math();
    13. while (true) {
    14. math.compute();
    15. }
    16. }
    17. }

    1,使用top命令或者top -p 进程号指定显示你的java进程的内存情况,pid是你的java进程号,比如19663
    image.png
    2,按H,获取每个线程的内存情况
    image.png
    3,找到内存和cpu占用最高的线程tid,比如19664
    4,转为十六进制得到 0x4cd0,此为线程id的十六进制表示
    5,执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调 用方法
    image.png

    6,查看对应的堆栈信息找出可能存在问题的代码