Linux 下查看 Java 服务进程占用(CPU / 内存)并定位具体服务

前言

在服务器运维过程中,经常会遇到服务器负载高、内存占用过大的问题,通过 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 服务,都能快速定位占用资源异常的服务,为后续优化、重启、扩容提供依据。

相关推荐
她的男孩几秒前
权限通了、列表有数,一点分页就炸Forge Admin 用 COUNT(1) 扛住复杂待办
java·spring boot·mybatis
七月吃橘子5 分钟前
WSL2+Docker+Ollama,本地部署大模型实践(Qwen1.8b)
运维·docker·容器
骑着蜗牛撵大象3277 分钟前
豆包 Seed 驱动的记账智能体:从拍票抽取到月报生成的全链路落地记录
java·前端·javascript·结构化输出·豆包seed·多模态识别·记账系统
影视飓风TIM12 分钟前
Linux 进程信号原理与剖析
linux·运维·服务器
憧憬成为java架构高手的小白16 分钟前
langchain4j手敲理解
java·langchain
缘友一世30 分钟前
开源 Linux截图工具闪构(SnapForge)
linux·运维·ubuntu·开源·截图
iCxhust33 分钟前
先想好如何测试:让测试驱动你的程序设计
运维·服务器·软件工程·编程的艺术
10mAh1 小时前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
Philtell1 小时前
突然连接不上内网服务器的问题
运维·服务器
做运维的阿瑞1 小时前
Docker常见故障全方位排查指南
运维·docker·云原生·容器