使用JVisualVM查找并定位Java程序CPU使用率过高问题

来源:互联网 发布:linux设备驱动开发详解 编辑:程序博客网 时间:2024/06/02 01:07

今天发现写的爬虫一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题。唉~~我就是小白呀

注:文章中截图来自程序调整后的截图,可能CPU占用率过高问题并不明显。


最初想通过java自带的JVisualVM来调试,但发现JVisualVM最多查找到类。



如果所示,但不能更详细的进行定位。于是参考了网上的部分文章,经过一步步,最终实现了定位了出问题的代码。

一、查找进程

查找问题进程比较简单,因为问题集中在CPU资源占用过高,那么我们查找进程时只需关注CPU。

打开JVisualVM,在Applications(中文版写的应用程序)面板中即可看到应用所在进程的PID8596和11556。



需要注意的是该工具并不能定位到线程。

二、查找线程

根据进程查找线程,有两种方法。

1、使用window自带命令pslist

 

首先确认系统是否安装了pslist命令程序,如果命令不识别即没有安装,则上微软官方网址http://technet.microsoft.com/en-us/sysinternals/bb896682.aspx下载,下载完将其解压到C:\Windows\System32路径下即可使用。


2、利用微软提供的Process Explorer工具(推荐使用这个工具,可视化界面看起来很方便)

一般在windows下只能查看进程的CPU占用率,想要查看线程的CPU占用率可以通过该工具。下载地址是http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx


下载后运行起来,找到PID为8596的进程


右键点击Properties...选项,看到如下信息:


可以看到占用CPU最多的也是TID为20728的线程。

三、问题定位

问题定位需要以下步骤:

1、将线程TID转换为十六进制

因为线程dump信息中线程TID是十六进制的(堆dump也是这样),所以我们首先转换进制,这里通过系统自带的计算器进行转换。


记录下50F8这个数字。

2、在JVisualVM中的中线程dump中查找“50F8”

JVisualVM中,应用程序右击,找到“线程Dump”



全选复制出来,通过Notepad++工具打开该文档,搜索“50F8”,可以看到问题定位到了具体的哪一行。(因为我程序是修改过的,所以CPU占用并没有太大问题,自然也就定位到正常的JVM处)



最后根据定位的位置去找问题就可以啦~~~·

原创粉丝点击