Java进程资源占用过高问题排查
约 1366 字大约 5 分钟
2025-08-28
首先找到资源占用过高的进程
首先使用top命令,查看资源占用过高的进程 【PID】如果不熟悉服务器上有哪些进程,可以使用如下命令查看进程启动目录:
1 jps -l:可以查看进程启动目录以及有哪些java进程
2 ps -aux | grep 'java' 列出服务器上所有启动的java进程以及启动参数等信息
通过以上两个命令,可以大概找到java进程的启动参数以及启动目录,配置文件的位置,为排查问题做准备;
使用top命令分析进程中线程资源的使用情况
top -p pid -H此命令可以列出进程中所有线程资源的使用情况,在这一步,我们可以记录资源占用过高的线程PID;
接下来,将线程的id转换为十六进制数据:
printf "%x\n" `线程ID`使用jstack工具,打印java线程的堆栈信息:
jstack pid >> stack.log主要查看堆栈信息的nid,将nid和转换的十六进制数对比即可查看到那个线程占用资源高;
下面分析下jstack命令输出的信息:

- 线程名:Yield-Outlier-Pool-thread-34
- 线程优先级:prio=5
- 一个地址(该地址是什么地址,存疑):tid
- 线程十六进制id:nid
- 线程状态:Thread.State:WAITING
- 线程当前所处方法:at sun.misc.Unsafe.park
- 向上箭头表示线程的执行历程。
top命令分析
基本命令:
top [选项]
案例:top –d 1//设置1秒刷新一次
选项:
-d 秒数:指定top命令每隔几秒更新。默认是3秒在top命令的交互模式当中可以执行的命令:
-n <次数> 运行指定次数后退出。
-p <PID> 仅显示指定进程的信息。
-u <用户名> 仅显示特定用户的进程。
-H 显示线程(默认按进程显示)。
-o <字段> 按指定字段排序(如 top -o %CPU)。
-c 显示完整命令行(默认仅显示进程名)。
-i:使top不显示任何闲置或者僵死进程。
-p:通过指定监控进程ID来仅仅监控某个进程的状态。
-s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
操作选项:
P:以CPU使用率排序,默认就是此项
M:以内存的使用率排序
N:以PID排序
q:退出toptop命令结果解释:

- 第一行信息为任务队列信息
| 内容 | 说明 |
|---|---|
| 12:26:46 | 系统当前时间 |
| up 1 day, 13:32 | 系统的运行时间,本机已经运行1天13小时32分钟 |
| 2 users | 当前登录了两个用户 |
| load average: 0.00, 0.00, 0.00 | 系统在之前1分钟,5分钟,15分钟的平均负载。一般认为小于1时,负载较小。如果大于1,系统已经超出负荷。 |
- 第二行为进程信息
| Tasks: 95 total | 系统中的进程总数 |
|---|---|
| 1 running | 正在运行的进程数 |
| 94 sleeping | 睡眠的进程 |
| 0 stopped | 正在停止的进程 |
| 0 zombie | 僵尸进程。如果不是0,需要手工检查僵尸进程 |
- 第三行为CPU信息
| 参数Cpu(s): | 说明 |
|---|---|
| 0.1%us | 用户模式占用的CPU百分比 |
| 0.1%sy | 系统模式占用的CPU百分比 |
| 0.0%ni | 改变过优先级的用户进程占用的CPU百分比 |
| 99.7%id | 空闲CPU的CPU百分比 |
| 0.1%wa | 等待输入/输出的进程的占用CPU百分比 |
| 0.0%hi | 硬中断请求服务占用的CPU百分比 |
| 0.1%si | 软中断请求服务占用的CPU百分比 |
| 0.0%st | st(Steal time)虚拟时间百分比。就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比。 |
- 第四行为物理内存信息
| 参数Mem | 描述 |
|---|---|
| 625344k total | 物理内存的总量,单位KB |
| 571504k used | 已经使用的物理内存数量 |
| 53840k free | 空闲的物理内存数量,我们使用的是虚拟机,总共只分配了628MB内存,所以只有53MB的空闲内存了 |
| 65800k buffers | 作为缓冲的内存数量 |
- 第五行为交换分区(swap)信息
| 参数Swap | 描述 |
|---|---|
| 524280k total | 交换分区(虚拟内存)的总大小 |
| 0k used | 已经使用的交互分区的大小 |
| 524280k free | 空闲交换分区的大小 |
| 409280k cached | 作为缓存的交互分区的大小 |
- 退出操作:q或者ctrl+c或者ctrl+z或者esc
- 执行上述命令后,可以按P、M、N对查询出的进程结果进行排序。
进程列表含义:
- PID:进程 ID
- USER:所属用户
- PR/NI:进程优先级/Nice 值(NI 影响调度优先级)
- VIRT/RES/SHR:虚拟/物理/共享内存
- S:进程状态(R 运行,S 休眠,Z 僵尸)
- %CPU:CPU 使用率
- %MEM:内存使用率
- TIME+:累计 CPU 占用时间
- COMMAND:进程名称
top命令也可以同事监控多个指定的进程:
top -p <PID1>,<PID2>,<PID3>监控特定进程。
贡献者
版权所有
版权归属:codingLab
许可证:bugcode