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 服务,都能快速定位占用资源异常的服务,为后续优化、重启、扩容提供依据。

相关推荐
微尘寒风3 小时前
【Git】的安装和使用
java·git
y = xⁿ3 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
贝锐4 小时前
从国产化信创设备到商用安卓终端,向日葵如何帮助企业实现统一运维管理?
linux·运维·远程控制
侧耳倾听1114 小时前
jwt使用简介
java·jwt
顶点多余4 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手5 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神5 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
Julien20045 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
2601_962066495 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
天远Date Lab6 小时前
零信任架构实战:基于天远双人婚姻评估查询构建自动化房产按揭联合审查网关
运维·人工智能·架构·自动化