前言

在服务器运维过程中,经常会遇到服务器负载高、内存占用过大的问题,通过 top 命令可以快速看到哪些进程占用资源最高,但很多时候只能看到 java 进程,无法直接定位是哪个微服务、哪个 Jar 包占用了大量 CPU 或内存。

本文详细介绍如何通过 Linux 命令,从 top 定位高占用 PID,再精准找到对应的 Java 服务启动目录、Jar 包名称、启动参数,快速定位问题服务。


一、先通过 top 找到高占用 Java 进程

执行 top 命令,按 M(按内存排序)、P(按 CPU 排序),可以看到类似如下输出:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 5079 root      20   0  9238064  3.8g  12100 S   4.0 12.0   2027:56 java
24756 root      20   0  9360080  1.9g  12228 S   4.0  6.2 624:03.61 java
  • RES:实际物理内存占用
  • %CPU:CPU 使用率
  • PID:进程号(关键)

比如上面 PID=5079 占用内存 3.8g,是需要重点排查的 Java 服务。

二、通过 PID 定位具体 Java 服务

拿到 PID 后,使用以下命令定位服务信息。

1. 查看进程基本信息(推荐)

bash

运行

ps -fp 5079

输出会包含:启动用户、PID、PPID、启动时间、完整启动命令

2. 查看完整启动参数(Jar 包名、配置文件)

bash

运行

cat /proc/5079/cmdline | tr '\0' ' '

cmdline 保存了进程启动时的完整命令,tr '\0' ' ' 用于格式化换行,方便查看。

3. 查看服务所在工作目录

bash

运行

ll /proc/5079/cwd

cwd 是进程运行目录,通常就是 Jar 包所在目录,可直接定位服务部署路径。

4. 查看进程打开的文件 / 端口(辅助定位)

bash

运行

lsof -p 5079

或查看监听端口:

bash

运行

netstat -ntlp | grep 5079
ss -ntlp | grep 5079

三、批量查看所有 Java 服务及其占用

如果服务器上有多个 Java 微服务,想一次性列出所有 Java 进程及资源占用:

1. 列出所有 Java 进程

bash

运行

ps -ef | grep java | grep -v grep

2. 显示 Java 进程 PID、内存、CPU、启动命令

bash

运行

ps -eo pid,ppid,pcpu,pmem,cmd | grep java | grep -v grep

3. 配合 top 实时监控

bash

运行

top -p 5079

只监控单个进程,避免信息干扰。


四、常用组合命令(直接复制使用)

1. 一键定位高内存 Java 服务

bash

运行

# 按内存排序显示 Java 进程
ps -eo pid,pmem,cmd | grep java | grep -v grep | sort -k 2 -r

2. 一键定位高 CPU Java 服务

bash

运行

# 按CPU排序显示 Java 进程
ps -eo pid,pcpu,cmd | grep java | grep -v grep | sort -k 2 -r

3. 查看 PID 对应服务完整信息(终极版)

bash

运行

PID=5079
echo "进程目录:$(readlink /proc/$PID/cwd)"
echo "启动命令:$(cat /proc/$PID/cmdline | tr '\0' ' ')"
echo "端口占用:$(ss -ntlp | grep $PID)"

五、常见问题说明

  1. 看到多个 java 进程分不清?微服务架构下很常见,通过 cwd 目录、jar 包名称、端口号即可区分。

  2. RES 虚拟内存很高?Java 进程会占用堆外内存、线程栈等,RES 更能反映真实物理内存占用。

  3. CPU 持续 100%?可进一步使用 jstack 打印线程栈,定位死循环、GC 频繁等问题。


总结

  1. top → 定位高占用 PID
  2. ps -fp PID → 查看基本信息
  3. /proc/PID/cmdline → 查看完整启动命令
  4. /proc/PID/cwd → 定位服务部署目录
  5. ss/netstat → 确认服务端口

掌握这套流程,无论服务器上有多少个 Java 服务,都能快速定位占用资源异常的服务,为后续优化、重启、扩容提供依据。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐