高手是如何定位内存问题的代码位置的

java程序CPU利用率高怎么办

请jstack神器来帮忙

 

本文介绍Linux环境下使用jstack定位问题的秘笈

工具/原料

  • Linux
  • java
  • thread
  • jstack
  • top
  • ps
  • printf
  • Runnable

方法/步骤

  1. 1 一个CPU密集型线程的demo:

    package chapter1;

    public class FindJavaThreadInTaskManager {    

        public static void main(String[] args) {        

                Thread thread = new Thread(new Worker());        

                thread.start();    

        }   

     static class Worker implements Runnable {        

            @Override        

            public void run() {            

                while (true) {                

                    System.out.println("Thread Name:" + Thread.currentThread().getName());           

                 }       

             }   

         }

    }

    高手是怎么使用jstack精确找到异常代码的
  2. 2将上述代码打成Jar。

    在Linux上执行上述代码

     

     

    命令:

    java -jar JavaStudy.jar

    高手是怎么使用jstack精确找到异常代码的
  3. 3    找到CPU利用率持续比较高的进程,获取进程号,此处PID为3036 

    命令:

    top

    高手是怎么使用jstack精确找到异常代码的
  4. 4 找到上述进程中,CPU利用率比较高的线程号TID(十进制数),此处为3046

    命令:

    ps p 3036 -L -o pcpu,pmem,pid,tid,time,tname,cmd

    高手是怎么使用jstack精确找到异常代码的
  5. 5  将获取的线程号(十进制数)转换成十六进制,此处为0xb46

    命令:

    printf "%x\n"  3046

    高手是怎么使用jstack精确找到异常代码的
  6. 6 查看进程PID为3036中

    nid为0xb46的线程信息。

    命令:

    jstack -l 3036

    高手是怎么使用jstack精确找到异常代码的
  7. 总结:

    可以看到jstack命令的输出结果是相当准确的:

    显示耗CPU比较高的代码与实际情况相同,都是第13行。

    放心的用吧。

    Enjoy youself!

    高手是怎么使用jstack精确找到异常代码的
 
 
posted @ 2017-06-26 14:39  一人浅醉-  阅读(1901)  评论(0编辑  收藏  举报