性能堆分析思路

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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

Bobo 有一个 n 个点&#xff0c;m 条边的有向无环图&#xff08;即对于任意点 v&#xff0c;不存在从点 v 开始、点 v 结束的路径&#xff09;。为了方便&#xff0c;点用 1,2,…,n 编号。 设 count(x,y) 表示点 x 到点 y 不同的路径数量&#xff08;规定 count(x,x)0&#xff…

GC 调优(实战篇) - GC参考手册

说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位时间内分配的量; 同理, Promotion Rate 翻译为 提升速率; 您应该已经阅读了前面的章节: 垃圾收集简介 - GC参考手册Java中的垃圾收集 - GC参考手册GC 算法(基础篇) - GC参考手册GC 算法(实现篇)…

01 HTML

1.什么是HTML&#xff1f;(Hyper Text Markup Language:超文本标记语言)超文本&#xff1a;功能比普通文本更加强大标记语言&#xff1a;使用一组标签对内容进行描述的一门语言(它不是编程语言)2.语法和规范&#xff1f;HTML文件都是以.html或者.htm结尾的&#xff0c;建议使用…

图的四种最短路径算法

本文总结了图的几种最短路径算法的实现&#xff1a;深度或广度优先搜索算法&#xff0c;弗洛伊德算法&#xff0c;迪杰斯特拉算法&#xff0c;Bellman-Ford算法 1&#xff09;&#xff0c;深度或广度优先搜索算法&#xff08;解决单源最短路径&#xff09; 从起始结点开始访问所…

20101008 搬家

刚刚系统还原了&#xff0c;把软件啥的都装上了&#xff0c;忙完一切&#xff0c;该整理整理照片&#xff0c;写写博客了&#xff08;总是如果不及时写&#xff0c;就几乎永远不会写了&#xff09;。我一贯喜欢"工欲善其事&#xff0c;必先利其器"&#xff0c;装个wi…

ZooKeeper集群与Leader选举

说说你对ZooKeeper集群与Leader选举的理解&#xff1f; ZooKeeper是一个开源分布式协调服务、分布式数据一致性解决方案。可基于ZooKeeper实现命名服务、集群管理、Master选举、分布式锁等功能。 高可用 为了保证ZooKeeper的可用性&#xff0c;在生产环境中我们使用ZooKeeper…

JVM初探:内存分配、GC原理与垃圾收集器

JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为new时分配外, 我们着重介绍后面的3个步骤: I. 怎样分配- JVM内存分配策略 对象内存主要分配在新生代Eden区, 如果启用了本地线程分配缓冲, 则优先在…

02 CSS

使用 table 进行布局存在缺陷&#xff0c;而一般的布局都会采用 DIVCSS 来进行布局。 Div 它是一个html 标签&#xff0c;一个块级元素(单独显示一行)。它单独使用没有任何意义&#xff0c;必须结合 CSS 来使用。它主要用于页面的布局。 Span 它是一个 html 标签&#xff0c;…

为什么要在密码里加点“盐”

盐&#xff08;Salt&#xff09; 在密码学中&#xff0c;是指通过在密码任意固定位置插入特定的字符串&#xff0c;让散列后的结果和使用原始密码的散列结果不相符&#xff0c;这种过程称之为“加盐”。 以上这句话是维基百科上对于 Salt 的定义&#xff0c;但是仅凭这句话还是…

一致性哈希算法 应用

互联网创业中大部分人都是草根创业&#xff0c;这个时候没有强劲的服务器&#xff0c;也没有钱去买很昂贵的海量数据库。在这样严峻的条件下&#xff0c;一批又一批的创业者从创业中获得成 功&#xff0c;这个和当前的开源技术、海量数据架构有着必不可分的关系。比如我们使用m…

(9)How to take a picture of a black hole

https://www.ted.com/talks/katie_bouman_what_does_a_black_hole_look_like/transcript 00:13In the movie "Interstellar[ˌɪntərˈstelə(r)]星际的," we get an up-close look at a supermassive black hole. Set against a backdrop of bright gas, the black…

单个节点的缓存容量达到上限 Hash算法一致性

场景 单个节点的缓存容量达到上限&#xff0c;无法继续单点增加内存&#xff0c;如何解决&#xff1f; 单个节点支撑的QPS达到上限&#xff0c;如何解决&#xff1f; 初步方案 增加N个缓存节点&#xff0c;为了保证缓存数据的均匀&#xff0c;一般情况会采用对key值hash&…

java学习笔记11 (构造方法 this深探)

在开发中&#xff0c;经常需要在创建对象的同事明确对象对的属性值&#xff0c;比如一个person对象创建的时候就应该有name和age 等属性&#xff0c;那么如何做到在创建对象的同时给对象的属性值初始化值呢&#xff1f; 这里介绍构造方法 1 构造方法没有返回值类型&#xff0c;…

密码中不能包含全角字符的正则表达式

String regex "^((?![^\\x00-\\xff]).)*$"; String str "aA"; System.out.println(str.matches(regex));

编程算法 - 将排序数组按绝对值大小排序 代码(java)

一个含有多个元素的数组&#xff0c;有多种排序方式。它可以升序排列&#xff0c;可以降序排列&#xff0c;也可以像我们以前章节说过的&#xff0c;以波浪形方式排序&#xff0c;现在我们要看到的一种是绝对值排序。对于数组A,绝对值排序满足以下条件&#xff1a;|A[i]| < …

QT Linux打包发布

Linux&#xff1a; 1、用Release编译&#xff1b; 2、把可执行文件(如paike)放入新建目录中; 3、当前目录下编写脚本copyDependency.sh&#xff0c;把动态链接库导入当前目录&#xff1b; #!/bin/shexe"paike" #发布的程序名称destination"/home/paike"…

CRM公海自动回收规则

企微云CRM操作指南 – 道一云|企微https://wbg.do1.com.cn/xueyuan/2568.html 销售云 - 美洽 - 连接客户&#xff0c;亲密无间https://meiqia.com/sales-cloud 转载于:https://www.cnblogs.com/rgqancy/p/10695466.html

三分钟看懂一致性哈希算法

一致性哈希算法&#xff0c;作为分布式计算的数据分配参考&#xff0c;比传统的取模&#xff0c;划段都好很多。 在电信计费中&#xff0c;可以作为多台消息接口机和在线计费主机的分配算法&#xff0c;根据session_id来分配&#xff0c;这样当计费主机动态伸缩的时候&#xf…