资讯专栏INFORMATION COLUMN

Java进程CPU占用率100%问题排查

cyrils / 984人阅读

摘要:指的是占用了一个核心,两个核心是,以此类推。占用率及对应进程可以通过命令确定,在界面按显示完整的命令行参数,按显示每个核心的统计数据。查看线程堆栈,找到对应的类及行号,然后阅读代码查找可能的问题原因。

100%指的是占用了CPU一个核心,两个核心是200%,以此类推。
CPU占用率及对应进程ID(pid)可以通过top命令确定,在top界面按 c (显示完整的命令行参数),按 1 (显示每个核心的统计数据)。

这个问题最常见的有以下几种可能:

1、堆内存不足导致频繁Full GC
可以通过两个命令确定

sudo jmap -heap pid 查看堆内存的消耗情况

sudo jstat -gc pid interval count 查看GC情况,示例:sudo jstat -gc 5746 3000 5 代表查看5746进程的GC情况、每隔3000毫秒打印一次、总共打印5次。如果FGC/FGCT增长明显,说明Full GC很频繁。

后续处理:

如果情况紧急,那得马上重启Java应用进程

不紧急的话需要获取相关信息用于分析为什么堆内存被消耗完了,可能有内存泄漏问题,可以用 1)sudo jmap -histo pid | head -n 20 查看Java对象的占用统计信息,2)sudo jmap -dump:live,format=b,file=heap.bin pid 把堆转储导出到本地文件,可以用 Eclipse MAT 工具分析内存泄漏

2、代码实现问题
思路:追查具体是哪个线程占用了CPU,1)先查到本地系统CPU占用率高的线程ID,2)找到对应的Java线程及线程堆栈

top -H -p pid 查看某个进程里面哪些线程占用了CPU,把对应的线程ID拷贝下来,转为十六进制【IDEA》Tools》Groovy Console》println Long.toHexString(1234) 即可完成转换】。

sudo jstack -l -F pid | less 获取Java线程堆栈,用十六进制的本地线程ID搜索,会在某一行的nid处找到对应的线程。查看Java线程堆栈,找到对应的Java类及行号,然后阅读代码查找可能的问题原因。

jstack堆栈信息里tid/nid的说明
https://docs.oracle.com/javas...

The thread dump consists of the thread stack, including the thread state, for all Java threads in the virtual machine.

The header line contains the following information about the thread:
- Thread ID (tid), which is the address of a thread structure in memory.
- ID of the native thread (nid).

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73757.html

相关文章

  • 线上系统性问题定位与方法论

    摘要:很显然对于不同规模,不同功能的系统,这个问题无法一概而论。生产事件上报客服上报此类问题往往来自用户投诉,最重要的就是问题现象的复现。线上问题处理的核心是快速修复。以上说的都是问题发生后的消极应对措施。 前言一线程序员在工作中经常需要处理线上的问题或者故障,但工作几年下来发现,有些同事其实并不知道该如何去分析和解决这些问题,毫无章法的猜测和尝试,虽然在很多时候可以最终解决问题,但往往也会浪费大...

    leonardofed 评论0 收藏0
  • 一次生产 CPU 100% 排查优化实践

    摘要:发现这是的一个堆栈,前段时间正好解决过一个由于队列引起的一次强如也发生内存溢出没想到又来一出。因此初步判断为大量线程执行函数之后互相竞争导致使用率增高,而通过对堆栈发现是和使用有关。 showImg(https://segmentfault.com/img/remote/1460000017395756?w=1816&h=1080); 前言 到了年底果然都不太平,最近又收到了运维报警:...

    roundstones 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<