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

相关推荐
l1t28 分钟前
用split命令恢复被wget -c命令误追加的zip压缩包
linux
随性而行3601 小时前
微信API接口与AI自动化:开发者的实现思路
运维·服务器·开发语言·人工智能·微信·自动化
沫离痕1 小时前
Cassandra 4.0.11 Docker 安装与配置手册
java·spring boot
plainGeekDev1 小时前
libs 目录 → Gradle 依赖管理
android·java·kotlin
CodeStride1 小时前
就像长跑配速一样,我是如何平衡代码性能与可读性的
java
弹简特1 小时前
【Java项目-企悦抽】07-用户与认证模块-实现用户注册01
java·开发语言
L歪歪君1 小时前
Apache Doris全链路性能优化实战指南:从架构设计到生产落地
java·开发语言·算法
辉灰笔记2 小时前
MySQL8 意外关机/误移data目录导致服务启动失败 PID报错/权限报错 修复文档
linux·数据库·mysql·centos
山东点狮信息科技有限公司2 小时前
SpringBoot+VUE3,一套系统完成OA+HRM+CRM+MES+合同+项目管理 —— 深度解析点狮全业务管理平台
java·spring boot·后端
snow@li2 小时前
Java:Java 服务器(Web 容器 / Servlet 容器)完整工作清单
java·服务器·前端