windows下java项目cpu占用较高原因分析
2015-01-23 00:00
253 查看
在windows平台上要找出到底是哪个线程占用的cpu还不那么容易,linux用top就简单多了最后的解决方法:
1.找到java进程对应的pid。
找pid的方法是:打开任务管理器,然后点击 "查看" 菜单,然后点击 "选择列",把pid勾上,然后就可以在任务管理器里面看到所有进程的pid值了。(也可以用第三步中提到的工具直接查看)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/b4482a25b630b807086e166882cb4798.jpg)
2.然后把java进程导出快照。直接运行命令。
[java] view plaincopy
jstack -l 31372 > c:/31372.stack
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/1f23932e2df311cf0d50dc7a6b61e938.jpg)
我这里是指定把java所有的信息导出到c盘的31372.stack的文件里。
3.在windows下只能查看进程的cpu占用率,要查看线程的cpu占用率要借助其他的工具,我这里用的是微软提供的 Process Explorer v15.3
下载地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
下载完后解压运行
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/fc5bb13e76630778e5556e1c0fe5cfaa.jpg)
右键点击需要查看的进程---properties
4.然后选择 Threads 选项卡,找到占用cpu的线程的tid,比如我这里是 31876 的线程
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/e71844f0bdadf63444a77221543b221b.jpg)
5.把pid转换成16进制,我这里直接用系统自带的计算器转换,置于为什么要转换,是因为先前用jstack导出的信息里面线程对应的tid是16进制的。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/79d99a7d4e4d1f16aad86a991fd067a5.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/f35bcc8fef6e1e4e5455c60a9ca86668.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/15e9f5e828998d4aec00df40ab3abc20.jpg)
最后得到的线程pid的16进制的值为 7C84
6.在 c盘的31372.stack文件中查找 7C84
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/3912e77a0733da103764580a154771a5.jpg)
由于是我的程序已经该过了,这里没有异常的东西,所以这里没有什么异常内容。
我的问题没解决之前,找到到这里的内容为:
[java] view plaincopy
"Thread-23" prio=6 tid=0x03072400 nid=0x1b68 runnable [0x0372f000]
java.lang.Thread.State: RUNNABLE
at com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)
at com.horn.common.OrderUtil.hisExp(OrderUtil.java:228)
at com.horn.util.MsgManage.receiveMsg(MsgManage.java:961)
at com.horn.util.PollMessageThread.run(PollMessageThread.java:74)
Locked ownable synchronizers:
- None
于是 打开 t com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)
分析了下代码,问题找到了。
问题代码为:
[java] view plaincopy
// 100-999的随机数
int random = (int) (Math.random() * 1000);
while (random < 100) {
random = random * 10;
}
这样票眼看 是没问题
当时我写这段代码也没注意
关键在于 Math.random()的取值范围是大于0小于1 是吧?
如果Math.random() 的值为 0.00009以下... 就成死循环了...
现在修改为了
[java] view plaincopy
// 100-999的随机数
int random = new Random().nextInt(900) + 100;
转载自:http://blog.163.com/girl_lihuiyue@126/blog/static/18069621201311266218839/
1.找到java进程对应的pid。
找pid的方法是:打开任务管理器,然后点击 "查看" 菜单,然后点击 "选择列",把pid勾上,然后就可以在任务管理器里面看到所有进程的pid值了。(也可以用第三步中提到的工具直接查看)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/b4482a25b630b807086e166882cb4798.jpg)
2.然后把java进程导出快照。直接运行命令。
[java] view plaincopy
jstack -l 31372 > c:/31372.stack
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/1f23932e2df311cf0d50dc7a6b61e938.jpg)
我这里是指定把java所有的信息导出到c盘的31372.stack的文件里。
3.在windows下只能查看进程的cpu占用率,要查看线程的cpu占用率要借助其他的工具,我这里用的是微软提供的 Process Explorer v15.3
下载地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
下载完后解压运行
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/fc5bb13e76630778e5556e1c0fe5cfaa.jpg)
右键点击需要查看的进程---properties
4.然后选择 Threads 选项卡,找到占用cpu的线程的tid,比如我这里是 31876 的线程
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/e71844f0bdadf63444a77221543b221b.jpg)
5.把pid转换成16进制,我这里直接用系统自带的计算器转换,置于为什么要转换,是因为先前用jstack导出的信息里面线程对应的tid是16进制的。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/79d99a7d4e4d1f16aad86a991fd067a5.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/f35bcc8fef6e1e4e5455c60a9ca86668.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/15e9f5e828998d4aec00df40ab3abc20.jpg)
最后得到的线程pid的16进制的值为 7C84
6.在 c盘的31372.stack文件中查找 7C84
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/08/3912e77a0733da103764580a154771a5.jpg)
由于是我的程序已经该过了,这里没有异常的东西,所以这里没有什么异常内容。
我的问题没解决之前,找到到这里的内容为:
[java] view plaincopy
"Thread-23" prio=6 tid=0x03072400 nid=0x1b68 runnable [0x0372f000]
java.lang.Thread.State: RUNNABLE
at com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)
at com.horn.common.OrderUtil.hisExp(OrderUtil.java:228)
at com.horn.util.MsgManage.receiveMsg(MsgManage.java:961)
at com.horn.util.PollMessageThread.run(PollMessageThread.java:74)
Locked ownable synchronizers:
- None
于是 打开 t com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)
分析了下代码,问题找到了。
问题代码为:
[java] view plaincopy
// 100-999的随机数
int random = (int) (Math.random() * 1000);
while (random < 100) {
random = random * 10;
}
这样票眼看 是没问题
当时我写这段代码也没注意
关键在于 Math.random()的取值范围是大于0小于1 是吧?
如果Math.random() 的值为 0.00009以下... 就成死循环了...
现在修改为了
[java] view plaincopy
// 100-999的随机数
int random = new Random().nextInt(900) + 100;
转载自:http://blog.163.com/girl_lihuiyue@126/blog/static/18069621201311266218839/
相关文章推荐
- windows下java项目cpu占用较高原因分析
- windows下java项目cpu占用较高原因分析
- windows服务器java项目cpu占用较高原因分析
- Linux下Java进程占用CPU超较高原因分析
- Linux主机下 java项目CPU占用过高分析
- centos中分析java占用大量CPU资源的原因
- Java应用CPU占用100%原因分析
- CentOS中分析java占用大量CPU资源的原因
- windows 服务器cpu使占用高的原因分析与解决办法
- centos中分析java占用大量CPU资源的原因
- centos中分析java占用大量CPU资源的原因
- 分析java程序中cpu占用过高的线程
- windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
- 利用jstack分析JAVA应用CPU占用过高的问题
- 分析java程序中cpu占用过高的线程
- [原]分析Vista导致资源管理器占用CPU资源100%的问题的原因及解决办法
- 使用tomcat java进程占用cpu偏高的原因
- win7下CPU资源占用100%的原因分析及对策
- windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
- php-cgi进程占用cpu资源过多负载高的原因分析及解决步骤