我的一个java程序偶尔会出现cpu占用很高的情况

一直不知道什么原因

今天终于抽时间解决了

系统是win2003

jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线程分别占用的cpu呢

所以在windows平台上要找出到底是哪个线程占用的cpu还不那么容易,linux用top就简单多了

最后的解决方法:

1.找到java进程对应的pid。

找pid的方法是:打开任务管理器,然后点击 "查看" 菜单,然后点击 "选择列",把pid勾上,然后就可以在任务管理器里面看到所有进程的pid值了。(也可以用第三步中提到的工具直接查看)

2.然后把java进程导出快照。直接运行命令。

  1. 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

由于是我的程序已经该过了,这里没有异常的东西,所以这里没有什么异常内容。

我的问题没解决之前,找到到这里的内容为:

  1. "Thread-23" prio=6 tid=0x03072400 nid=0x1b68 runnable [0x0372f000]
  2. java.lang.Thread.State: RUNNABLE
  3. at com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)
  4. at com.horn.common.OrderUtil.hisExp(OrderUtil.java:228)
  5. at com.horn.util.MsgManage.receiveMsg(MsgManage.java:961)
  6. at com.horn.util.PollMessageThread.run(PollMessageThread.java:74)
  7. Locked ownable synchronizers:
  8. - None

于是 打开 t com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)

分析了下代码,问题找到了。

问题代码为:

  1. // 100-999的随机数
  2. int random = (int) (Math.random() * 1000);
  3. while (random < 100) {
  4. random = random * 10;
  5. }

这样票眼看 是没问题
当时我写这段代码也没注意
关键在于 Math.random()的取值范围是大于0小于1 是吧?
如果Math.random() 的值为 0.00009以下... 就成死循环了...

现在修改为了

  1. // 100-999的随机数
  2. int random = new Random().nextInt(900) + 100;

希望能给遇到问题的朋友一些帮助。

windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码的更多相关文章

  1. windows下揪出java程序占用cpu很高的线程

    背景 天天搞java,这些监控也都知道,用过,但也没往细里追究.因为也没碰见这种问题,这次还是静下来走一遍流程吧.与网上基本一致,不过我区分了下linux和windows的不一样.我感觉基本是程序写成 ...

  2. Linux排查Java程序占用CPU很高的解决办法

    Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...

  3. 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...

  4. Linux排查java程序占用cpu过高的线程代码

    分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此 ...

  5. 线上Java程序占用 CPU 过高,请说一下排查方法?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  6. Windows服务器java.exe占用CPU过高问题分析及解决

    最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...

  7. linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  8. 记一次java程序占用cpu超高排查

    1.首先通过top命令查看占用cpu过高的pid #top top - 18:07:25 up 48 days,  1:07,  3 users,  load average: 11.94, 11.9 ...

  9. windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

      1.情景展示 java虚拟机占用这么高的CPU,肯定不正常! 2.原因分析 第一个是tomcat,正在运行java项目: 第二个是eclipse,因为eclipse的运行依赖于java. 现在的问 ...

随机推荐

  1. hdu 5718 Oracle 高精度

    Oracle Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem ...

  2. C++ new、delete

    C++中向系统申请堆内存的方法为使用new.new[]操作符,new申请单个对象的内存,new[]申请对象数组的内存.对应的delete.delete[]操作符将new.new[]操作符申请到的内存还 ...

  3. Mobile Assistant

    闲来无事,分享一个小东西--手机小助手,历时两周,这里选择几个不错的界面以示效果! 如果有感兴趣的部分,欢迎随时交流!

  4. Bundle对象的使用

    在Android开发中,如果要通过一个Activity启动另外一个Activity,需要调用startActivity()函数,这个函数的参数是一个Intent对象,这个对象通常的初始化方式如下: I ...

  5. 最小生成树之Kruskal

    模板题,学习一下最小生成树的Kruskal算法 对于一个连通网(连通带权图,假定每条边上的权均为大于零的实数)来说,每棵树的权(即树中所有边的权值总和)也可能不同 具有权最小的生成树称为最小生成树 生 ...

  6. zoo.cfg配置

    zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg.其中各配置项的含义,解释如下: 1.tickTime:CS通信心跳时间 Zo ...

  7. SQL 数据库表标识列初始化 DBCC

    把ArimaIndexForecastModel这张表的标识列重置为0,前提是这张表执行过删除操作 示例:  dbcc checkident('ArimaIndexForecastModel',res ...

  8. 【C#学习笔记】数组使用

    using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { //int ...

  9. setTimeout/setInterval

    //使用 setTimeout 时需注意,当该代码执行时,JS 会立即编译函数第一个参数“code” //所以该函数的第一个参数应该为:需要编译的代码.或者一个函数 //例1:setTimeout(& ...

  10. RMAN duplicate from active遇到ora-17167,ora-12154

    最近在从活动数据库进行异机克隆时碰到了ORA-17629,ORA-17627,ORA-12154的错误,起初以为是一个Bug呢.Oracle Bug着实太多了,已经成了习惯性思维了.汗!错误提示是无法 ...