在这里总结一下查找Linux、Java环境下最耗CPU性能的代码段的方法。基本上原理就是使用top命令查看最耗cpu的进程和线程(子进程)。使用jstack把java线程堆栈给dump下来。然后,在堆栈信息中查找出对应的代码块。具体操作如下:

一、查找最耗cpu的进程

执行:top
输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root 3320m 689m 10m S 120.5 8.8 : java
root 2694m 21m S 11.1 0.3 :28.65 java
root 2694m 21m S 6.9 0.3 :18.50 java
root 2004m 389m 15m S 1.4 4.9 :47.65 java
root R 1.4 0.0 :00.01 top
root S 0.0 0.0 :02.50 init
root S 0.0 0.0 :00.00 kthreadd
root RT S 0.0 0.0 :00.02 migration/
root S 0.0 0.0 :01.16 ksoftirqd/
root RT S 0.0 0.0 :00.00 watchdog/

这里我们看到最耗cpu的Java进程是:12789

二、jstack堆栈信息保存

进入Java的安装目录(如:/usr/java/jdk1.6.0_34/bin),在bin文件夹中执行:./jstack 12789  >  jstackResult.txt 这样,就将堆栈信息保存到jstackResult.txt这个文件中了。jstackResult.txt中的内容大体如下:

三、查出最耗cpu的子进程(java线程)

执行:top -p  –H
输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root 3320m 689m 10m S 13.7 8.8 :57.24 java
root 3320m 689m 10m R 2.7 8.8 :57.68 java
root 3320m 689m 10m S 2.7 8.8 :49.73 java
root 3320m 689m 10m S 2.3 8.8 :55.86 java
root 3320m 689m 10m S 2.3 8.8 :50.22 java
root 3320m 689m 10m R 2.3 8.8 :37.94 java
root 3320m 689m 10m R 2.3 8.8 :17.72 java
root 3320m 689m 10m R 2.3 8.8 :18.59 java
root 3320m 689m 10m S 2.3 8.8 :00.05 java
root 3320m 689m 10m S 2.0 8.8 :07.45 java
root 3320m 689m 10m S 2.0 8.8 :12.15 java
root 3320m 689m 10m S 2.0 8.8 :11.94 java
root 3320m 689m 10m R 2.0 8.8 :00.50 java
root 3320m 689m 10m R 2.0 8.8 :24.82 java
root 3320m 689m 10m R 2.0 8.8 :27.09 java
root 3320m 689m 10m R 2.0 8.8 :19.02 java
root 3320m 689m 10m R 2.0 8.8 :40.06 java

找到12789下最耗性能的子进程。top命令使用-p参数来指定进程号,-H参数来显示线程。这里可以看到最耗cpu的进程(java中的线程)是11637。

四、从堆栈信息中查找最耗费性能的代码块

从上面看到,我们用top找出来的pid是十进制的。而dump下来的nid是十六进制的。其实他们是一个东西,只是进制不同。利用printf命令格式化来转换一下进制。

执行:printf %0x
输出:2d99

通过在dump出的堆栈信息中查找,就能找到问题所在了。

Linux中查找最耗性能的JAVA代码的更多相关文章

  1. Linux中查找最耗CPU的Java代码问题

    第一步: 查看消耗CPU最高的进程PID [lolaage@web2 tomcat-ns]$ top top - 13:23:32 up 42 days, 19:11,  3 users,  load ...

  2. Linux中常用的监控性能的命令(sar、mpstat,vmstat, iostat,)详解

    Linux中常用的监控性能的命令有: sar:能查看CPU的平均信息,还能查看指定CPU的信息.与mpstat相比,sar能查看CPU历史信息 mpstat:能查看所有CPU的平均信息,还能查看指定C ...

  3. linux中查找命令find、locate、whereis、which、type区别

    linux中查找命令find.locate.whereis.which.type区别 1. find Java代码 find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件.与查询数据库(/ ...

  4. linux中查找文件属于那个软件包的方法

    一.linux中查找文件属于那个软件包的方法 [root@salt prod]# whereis htpasswdhtpasswd: /usr/bin/htpasswd /usr/share/man/ ...

  5. sar命令,linux中最为全面的性能分析工具之一

    sar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工具将对系统当前的状态就行取样,然后通 ...

  6. systemd-analyze – 在Linux中查找系统启动性能统计信息

    您是否在使用 systemd 系统和服务管理器,并且您的 Linux 系统需要较长时间才能启动,或者您希望查看系统启动性能的报告? 如果是的话,你已经登陆了正确的地方. 在本文中,我们将向您展示如何使 ...

  7. linux中查找(find、locate、which、whereis、grep)命令汇总、帮助命令(man、whatis、apropos、info、help)汇总

    (一)find命令详解 find:功能:文件搜索: 语法:find[搜索范围][匹配条件]:  只要匹配条件完全符合才可以被显示,使用通配符*匹配条件*则可以显示匹配条件的所有目录,问号?匹配单个字符 ...

  8. 如何使用find命令在Linux中查找文件

    Linux Find命令是Linux系统管理员工具库中最强大的工具之一. Find是一个命令行实用程序,它允许您根据用户给定的表达式搜索目录层次结构中的文件和目录,并对每个匹配的文件应用用户指定的操作 ...

  9. 在 Linux 中查找和删除重复文件

    原文链接:https://www.linuxprobe.com/linux-FSlint.html FSlint同时具有GUI和CLI模式.因此,对于新手来说,这是一个用户友好的工具.FSlint不仅 ...

随机推荐

  1. django 一些库

    https://django-adminactions.readthedocs.io/en/latest/actions.html http://www.ziqiangxuetang.com/djan ...

  2. appcon 图标打包

    ERROR ITMS-90022: "Missing required icon file. The bundle does not contain an app icon for iPho ...

  3. linux:ACL权限

    ACL权限是为了防止权限不够用的情况,一般的权限有所有者.所属组.其他人这三种,当这三种满足不了我们的需求的时候就可以使用ACL权限: 比如:一个网络老师,给一个班的学员上课,他在linux的根目录下 ...

  4. Dive into python 实例学python (2) —— 自省,apihelper

    apihelper.py def info(object, spacing=10, collapse=1): """Print methods and doc strin ...

  5. JAVA多线程与多进程

    并发与并行是两个既相似而又不相同的概念,但往往容易混为一谈,这两者究竟有什么区别呢?本文通过一个例子让你更好地理解(本文由并发编程网翻译). 现代社会是并行的:多核.网络.云计算.用户负载,并发技术对 ...

  6. hduoj 4707 Pet 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4707 Pet Time Limit: 4000/2000 MS (Java/Others)    Memory ...

  7. Python学习总结14:时间模块datetime & time & calendar (一)

    Python中的常用于处理时间主要有3个模块datetime模块.time模块和calendar模块. 一.time模块 1. 在Python中表示时间的方式 1)时间戳(timestamp):通常来 ...

  8. SpringMvc:处理模型数据

    SpringMvc提供了以下途径输出模型数据: -ModelAndView:处理方法返回值类型为ModelAndView,方法体即可通过该对象添加模型数据 -Map或Model:入参为org.spri ...

  9. HDU 3308 LCIS(线段树)

    Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (in ...

  10. centos dhcp网络设置

    CentOS 网络设置修改   一.CentOS 修改IP地址 修改对应网卡的IP地址的配置文件# vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改以下内 ...