最近重新接手了一名离职员工挖的坑,就是在新平台上有一个接口,一旦运行起来,会调用一个递归排序方法,没多久CPU利用率瞬间飙升到85%-95%且长时间持续运行,一旦停止就恢复到20%以下,这让我不得不面重新对他写的代码做review,且重新关注性能问题。
首先要解决问题,就要确认是环境还是程序问题,由于这个平台已经在生产环境中应用了很多时间,所以环境问题应该不存在的,所以剩下的应该就是程序问题,要找到程序问题就是锁定是哪个方法引起来的,这里给大家介绍最快速的方法:
1:看进程,获得进程的信息(PID)
2:看线程,获得线程CPU的信息(TID)
3:对比进程信息找线程(这里涉及TID转换问题)
步骤如下:
1:看进程,获得进程的信息(PID)
利用微软提供的Process Explorer工具
一般在windows下只能查看进程的CPU占用率,想要查看线程的CPU占用率可以通过该工具。下载地址是:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
通过工具查找到进程PID以后,将该进程的信息保存到本地,在cmd命令窗口中执行命令:jstack 9272 > C:\test\cdf.log,该命令的作用是将PID为9272的进程信息保存在本地C:\cdf.log文件中。
2:看线程,获得线程CPU的信息(TID)
右键点击Properties...选项,看到如下信息:
可以看到占用CPU最多的TID线程有哪些,哪些高就查哪些TID。
3:对比进程信息找线程,解决问题(这里涉及TID转换问题)
问题定位需要以下步骤:
将线程TID转换为十六进制
因为通过jstack工具导出的信息中线程TID是十六进制的,所以我们首先转换进制,这里通过系统自带的计算器进行转换即可。
转换完成后,在jstack工具导出的cdf.log中查找转换后的值
通过Notepad++工具打开该cdf.log,搜索到如下信息,就可以看到问题定位到了哪个类的哪个方法,还能看到是谁在调用他
到这里,剩下的就是优化代码,解决问题了