蓝盟IT外包,Java程序占用CPU过多如何排除故障

发布者:上海IT外包来源:http://www.lanmon.net点击数:1112


这个问题可以说是Java面试的高频面试问题,很多面试官喜欢问这个问题,问题可能如下。
在线服务器的CPU利用率达到了100%,如果遇到这种情况,如何确定问题的原因?
这是夹克问题。 夹克问题有标准的夹克解法,掌握夹克,不仅可以解决面试官的问题。 否则我真的会掉在路上。
我们真的遇到这个问题的时候,该怎么排除问题?
模拟高CPU场景
首先,在一个程序中创建几个线程,并将其中一个线程设置为CPU利用率高的线程。
运行此程序时,前十个线程进入睡眠状态,只有最后一个线程继续占用CPU。
运行此程序可以启动一些列的操作来确定问题的原因。
故障诊断。
第一步是使用top找到最占用CPU的Java进程。
在实际环境中,首先确认是否是由Java程序产生的,如果有系统监视工具,可以直接通过警告消息传达是由哪个进程产生的,但有时也不知道。 需要手动进行故障诊断。
如果是面试场景,可能不需要确认这个问题,毕竟在Java面试中,面试官可能会直接告诉你Java占有的CPU太高了。
这一步也很简单。 是top命令。 基本上所有的同学都在用这个命令吧。
使用top命令发现占CPU  99.7 %的线程是Java进程,进程PID是13731。
在第2步中,使用top  -Hp命令检查最占用CPU的线程。
在上一步中,我在top命令中找到了那个Java进程。 那个过程有那么多线程,不是所有线程都占用CPU,但这一步是抓住这个罪恶的主谋,当然可能有多个。
执行top  -Hp  pid命令。 pid是前面的Java进程。 在这个例子中是13731。 完整的命令如下。
可以看到最占用CPU的线程的PID是13756。
然后将13756转换为十六进制。 以后使用。 可以直接在在线二进制转换的网站上转换。 转换结果为0x35bc。
第三步,保存线程堆栈信息。
可以使用jstack命令显示当前Java程序的所有线程信息。 用jstack命令保存找到的第一个Java进程的线程堆栈。第四步,查找线程堆栈中最昂贵的灾难线程。

第二步已经找到了这个罪魁祸首的线程PID,将其转换为十六进制。 第三步是保存的线程堆栈中所有线程的PID十六进制信息。 我们在线程栈中查找这个十六进制线程id  (0x35bc  )。

文/上海蓝盟  IT外包专家

IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部