windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
我的一个java程序偶尔会出现cpu占用很高的情况
一直不知道什么原因
今天终于抽时间解决了
系统是win2003
jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线程分别占用的cpu呢
所以在windows平台上要找出到底是哪个线程占用的cpu还不那么容易,linux用top就简单多了
最后的解决方法:
1.找到java进程对应的pid。
找pid的方法是:打开任务管理器,然后点击 "查看" 菜单,然后点击 "选择列",把pid勾上,然后就可以在任务管理器里面看到所有进程的pid值了。(也可以用第三步中提到的工具直接查看)

2.然后把java进程导出快照。直接运行命令。
- jstack -l 31372 > c:/31372.stack

我这里是指定把java所有的信息导出到c盘的31372.stack的文件里。
3.在windows下只能查看进程的cpu占用率,要查看线程的cpu占用率要借助其他的工具,我这里用的是微软提供的 Process Explorer v15.3
下载地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
下载完后解压运行

右键点击需要查看的进程---properties
4.然后选择 Threads 选项卡,找到占用cpu的线程的tid,比如我这里是 31876 的线程

5.把pid转换成16进制,我这里直接用系统自带的计算器转换,置于为什么要转换,是因为先前用jstack导出的信息里面线程对应的tid是16进制的。



最后得到的线程pid的16进制的值为 7C84
6.在 c盘的31372.stack文件中查找 7C84

由于是我的程序已经该过了,这里没有异常的东西,所以这里没有什么异常内容。
我的问题没解决之前,找到到这里的内容为:
- "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)
分析了下代码,问题找到了。
问题代码为:
- // 100-999的随机数
- int random = (int) (Math.random() * 1000);
- while (random < 100) {
- random = random * 10;
- }
这样票眼看 是没问题
当时我写这段代码也没注意
关键在于 Math.random()的取值范围是大于0小于1 是吧?
如果Math.random() 的值为 0.00009以下... 就成死循环了...
现在修改为了
- // 100-999的随机数
- int random = new Random().nextInt(900) + 100;
希望能给遇到问题的朋友一些帮助。
windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码的更多相关文章
- windows下揪出java程序占用cpu很高的线程
背景 天天搞java,这些监控也都知道,用过,但也没往细里追究.因为也没碰见这种问题,这次还是静下来走一遍流程吧.与网上基本一致,不过我区分了下linux和windows的不一样.我感觉基本是程序写成 ...
- Linux排查Java程序占用CPU很高的解决办法
Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...
- 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法
这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...
- Linux排查java程序占用cpu过高的线程代码
分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此 ...
- 线上Java程序占用 CPU 过高,请说一下排查方法?
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- Windows服务器java.exe占用CPU过高问题分析及解决
最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...
- linux下分析java程序占用CPU、内存过高
一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...
- 记一次java程序占用cpu超高排查
1.首先通过top命令查看占用cpu过高的pid #top top - 18:07:25 up 48 days, 1:07, 3 users, load average: 11.94, 11.9 ...
- windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)
1.情景展示 java虚拟机占用这么高的CPU,肯定不正常! 2.原因分析 第一个是tomcat,正在运行java项目: 第二个是eclipse,因为eclipse的运行依赖于java. 现在的问 ...
随机推荐
- 运行时报错 ADB server didn’t ACK
查看进程中所有和ADB有关的进程,全都结束了,包括什么豌豆荚之类的(大多数情况是占用端口),之后重新启动Eclipse.
- 转:ORACLE的JDBC连接方式:OCI和THIN
oracle的jdbc连接方式:oci和thin oci和thin是Oracle提供的两套Java访问Oracle数据库方式. thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracl ...
- Codeforces 377 A Maze【DFS】
题意:给出n*m的矩阵,矩阵由'.'和'#'组成,再给出k,表示需要在'.'处加k堵墙,使得剩下的'.'仍然是连通的 先统计出这个矩阵里面总的点数'.'为sum 因为题目说了一定会有一个解,所以找到一 ...
- Js内置对象的应用
Boolean.Number.Objectfunction对象 另一种写法: var add=new Function("x","y",&q ...
- NBUT 1121 Sakuya's Fly Knife 飞刀(暴力)
题意:给出一个带有n*m个格子的矩阵,部分格子中有靶子target,现在要从一个没有靶子的格子中射出飞刀数把,飞刀是可穿透靶子的,同一直线上都可以一刀全射掉.现在问在哪个格子射出飞刀,可以在全部射中的 ...
- python练习程序(c100经典例17)
题目: 输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. def foo(a): l=len(a); letters=0; space=0; digit=0; others=0; f ...
- spring.net IOC容器
spring.net 通过配置文件的方式 帮我们实现了IoC功能,实现方式非常灵活,且多种多样. 点击查看 创建对象 我们只需定义接口和实现方法,spring.net帮我们实现了其他功能. 第一步,定 ...
- Intent七大属性
一.Intent的作用是什么? 1.Intent 用于封装程序的”调用意图“.两个Activity之间,可以把需要交换的数据封装成Bundle对象,然后使用Intent携带Bundle对象,实现 ...
- c# 读取其他程序的ListView内容
ArcMap没找到一个导出图层字段结构的功能,自已花点时间用C#做了个小工具,专门用来导arcmap中图层属性面板中的字段信息. 使用说明: 1) 点击“查找窗口”按钮.2) 在ListView控件上 ...
- 嵌入式 H264视频通过RTMP直播
前面的文章中提到了通过RTSP(Real Time Streaming Protocol)的方式来实现视频的直播,但RTSP方式的一个弊端是如果需要支持客户端通过网页来访问,就需要在在页面中嵌入一个A ...