---------------------------------------linux下如何定位代码问题-------------------------------java
一、先经过top命令找到消耗cpu很高的进程id假设是123linux
二、执行top -p 123单独监控该进程shell
三、在第2步的监控界面输入H,获取当前进程下的全部线程信息数据库
四、找到消耗cpu特别高的线程编号,假设是123bash
五、执行jstack 123456对当前的进程作dump,输出全部的线程信息服务器
6 将第4步获得的线程编号11354转成16进制是0x7bapp
7 根据第6步获得的0x7b在第5步的线程信息里面去找对应线程内容jvm
8 解读线程信息,定位具体代码位置工具
-----------------------------分割线----------------------------------------------性能
最近在压力测试工做中碰到java应用某台机器cpu比较高的状况,特意下笔记之后总结:
一个简单的淘宝认证接口 须要插入读写数据库2次。每次爬取数据,入库。完成。
正常状况下:
应用使用cpu在 :50%--80%
压力高--异常状况下:
cpu利用率在:90%---90%
在网上查了下,通常java应用cpu太高基本上是由于
1.程序计算比较密集
2.程序死循环
3.程序逻请求堵塞
4.IO读写过高
方法一:
分析步骤:
1.登录应用机器,top -d 1命令查看 当前占用cpu资源最多的,通常排名第一位确定是java进程
通常也可能存在多个java进程
观察 top 消耗第一的资源是PID=1679的线程
2.查看进程的哪一个线程占用cpu比较高,取线上另一台正常状况下利用cpu比较高的应用:经过
ps -mp pid -o THREAD,tid,time命令查看该进程的线程状况
经过以上线程CPU切片 耗时在pid=1679 Tid =1896 耗时 1分59秒,4%CPU占用最大。时间最长。
TID为1679的线程利用cpu资源比较多,怎么能看到这个线程在干什么呢?
须要将1896 转换为16进制,便于在jvm堆栈中查找。
printf "%x\n" 1896 ----768
经过jstack命令来查看下当前内存状态:
定位到cpu太高是IO读写过高 ,接下来就是找开发人员确认这段代码是否能够优化。
方法二:
在作压测的时候,开发给了一个工具 show-busy-java-threads.sh
在排查Java
的CPU
性能问题时,找出Java进程中消耗cpu多(top us值太高)的线程,查看它的线程栈,从而找出有性能问题的方法调用。
####截取一段
其实就是个shell文件,把这个文件上传到目标服务器(linux),记得更改文件的读写权限: chmod -R 777 show-busy-java-threads.sh
接方法一 top以后,只须要下命令 :./show-busy-java-threads.sh -p pid 后面CPU占用高的定位就分析出来了,具体如图