性能堆分析思路

1、通过top找到对应的耗费资源比较大的进程ID,

2、ps p 进程ID -L -o pcpu,pid,tid,time,tname,cmd

3、然后利用上面面命令来找到对应的线程

4、利用Listthread方法 列出所有线程,与找到对应资源比较大的匹配

5、利用stack查找到对应的堆栈调用代码,来分析到具体什么位置导致的

public void ListThread()
    { 
    String pid=    querytopCPU(); 
      String cmd2="jstack -l "+pid;
        Map<String,String> mssrg=nid(cmd2);
        ThreadGroup group = Thread.currentThread().getThreadGroup();  
        ThreadGroup topGroup = group;  
        // 遍历线程组树,获取根线程组  
        while (group != null) {  
            topGroup = group;  
            group = group.getParent();  
        }  
        // 激活的线程数加倍  
        int estimatedSize = topGroup.activeCount() * 2;  
        Thread[] slackList = new Thread[estimatedSize];  
        // 获取根线程组的所有线程  
        int actualSize = topGroup.enumerate(slackList);  
        // copy into a list that is the exact size  
        Thread[] list = new Thread[actualSize];   
        java.lang.System.arraycopy(slackList, 0, list, 0, actualSize);  
        java.lang.System.out.println("Thread list size == " + list.length);  
        for (Thread thread : list) {  
            java.lang.System.out.println(thread.getName());  
        }   
        
        int i=0; 
        List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();  
        for(Thread t :     list){
        Map<String, Object>    imap = new HashMap<String, Object>();
            imap.put("id", t.getId());
            imap.put("name", t.getName());
            imap.put("state", t.getState());
            imap.put("whofirst",t.getPriority());
            imap.put("groupname",t.getThreadGroup().getName());
            imap.put("pid",pid);
            String tid="";
            
             for (Entry<String, String> entry : mssrg.entrySet()) {
                  
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                if(value.indexOf(t.getName())>-1)
                { 
                    tid=key;
                }
             
          }
            //
            
            imap.put("tid",tid);
            String stname="";
            if(t.getStackTrace().length>0)
            {
                stname+="ClassName:"+ste.getClassName()+",FileName:"+ste.getFileName()+",Method:"+ste.getMethodName()+",LineNum:"+ste.getLineNumber();
//                }
                stname=t.getStackTrace()[t.getStackTrace().length-1].getFileName()+",LineNum:"+t.getStackTrace()[t.getStackTrace().length-1].getLineNumber();
            }
            imap.put("stack",stname);
            list2.add(imap);
     
        } 
        // 将查询的数据返回到前台
        sendMsg(JSONTool.convertCollection2Json(list2));    
    }

 

 

public String querytopCPU()
    {
        String name = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();    
        java.lang.System.out.println(name);    
        // 首先获取本应用程序的PID
        String pid = name.split("@")[0];    
        java.lang.System.out.println("Pid is:" + pid);   
          //windows  
//          String cmd = "F:\\apache-tomcat-6.0.20.exe";  
//          String cmd = "D:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE F:\\test.doc";  
//          String cmd = "cmd.exe /c start F:\\test.doc";  
            String cmd = "ping www.baidu.com";  
            //linux  
//          String cmd = "./fork_wait";  
//          String cmd = "ls -l";  
//          String[] cmd=new String[3];  
//          cmd[0]="/bin/sh";  
//          cmd[1]="-c";  
//          cmd[2]="ls -l ./";    
         //获取线程列表
         String cmd1="ps p "+pid+" -L -o pcpu,pid,tid,time,tname,cmd";
         String cmd2="jstack -l "+pid;
         String cmd3="ps p "+pid+" -L -o tid,pcpu";
 
         return pid;
        } 

 

public String stack(@RequestParam(value = "id", required = false) String id)
    { 
String rtStr="";
        ThreadGroup group = Thread.currentThread().getThreadGroup();  
        ThreadGroup topGroup = group;  
        // 遍历线程组树,获取根线程组  
        while (group != null) {  
            topGroup = group;  
            group = group.getParent();  
        }  
        // 激活的线程数加倍  
        int estimatedSize = topGroup.activeCount() * 2;  
        Thread[] slackList = new Thread[estimatedSize];  
        // 获取根线程组的所有线程  
        int actualSize = topGroup.enumerate(slackList);  
        // copy into a list that is the exact size  
        Thread[] list = new Thread[actualSize];   
        java.lang.System.arraycopy(slackList, 0, list, 0, actualSize);  
        java.lang.System.out.println("Thread list size == " + list.length);  
        for (Thread thread : list) {  
            java.lang.System.out.println(thread.getName());  
            String tid=thread.getId()+"";
            if(tid.equals(id) )
            {
                for(StackTraceElement ste : thread.getStackTrace())
                    { 
                    rtStr+="ClassName:"+ste.getClassName()+",FileName:"+ste.getFileName()+",Method:"+ste.getMethodName()+",LineNum:"+ste.getLineNumber()+"\r\n";
                    }
            }
        }   
        return rtStr;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨航 AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值