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

相关推荐
步行cgn2 分钟前
Spring 中完整的 Scope 选项详解
java·后端·spring
Lsetea20 分钟前
Nginx报No required SSL certificate was sent:mTLS客户端证书排查
运维·nginx·https·ssl·openssl
hai_android23 分钟前
Android MeasureSpec 详解
android·java·kotlin
GeW32 分钟前
从内核到数据:Linux与工业数据库如何支撑高端制造
linux
山岚的运维笔记1 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
DFT计算杂谈1 小时前
TRIQS 4.0.2 完整安装与使用指南
运维
小小的木头人2 小时前
Linux systemd Service 与 Timer 定时任务原理及实战
linux
阳光宅男@李光熠2 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
张宜强2 小时前
025 安居租赁 · 房屋租赁平台
java·课程设计
Java_2017_csdn2 小时前
ReentrantLock 与 Redis RLock 对比解读
java