在 CentOS 系统中,通过 进程 ID(PID) 查看内存占用的方法有多种,以下是最常用的几种方式,涵盖基础命令、实时监控和进阶分析:
方法一:使用 ps
命令(快速查看静态数据)
ps
命令可以直接通过 PID 获取进程的内存占用信息,包括 物理内存(RSS) 和 内存百分比(% MEM)。
命令格式:
bash
ps -p <PID> -o %mem,rss,cmd
-
参数说明:
-
-p <PID>
:指定进程 ID。 -
-o %mem,rss,cmd
:指定输出字段(内存百分比、常驻内存、进程命令)。
-
示例:
假设 PID 为 12345
,执行:
bash
ps -p 12345 -o %mem,rss,cmd
输出结果:
plaintext
%MEM RSS CMD
0.8 45678 /usr/local/go-app/main
-
%MEM
:进程占用系统总内存的百分比(如0.8%
)。 -
RSS
:常驻内存大小(单位为 KB,如45678 KB ≈ 44.6 MB
)。
方法二:使用 top
命令(实时动态监控)
top
命令可实时显示进程的资源占用,支持按 PID 过滤和动态刷新。
命令格式:
bash
top -p <PID>
-
操作说明:
- 执行命令后,界面会实时刷新,显示该 PID 的详细信息。
- 关键列:
-
RES
:物理内存占用(单位为 KB,与ps
中的 RSS 一致)。 -
%MEM
:内存占用百分比。 -
SHR
:共享内存(如共享库占用的内存)。
-
示例:
bash
top -p 12345
输出片段:
plaintext
top - 14:23:45 up 1 day, 22:15, 2 users, load average: 0.12, 0.15, 0.14
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32838120 total, 2345672 free, 28987652 used, 1504796 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2976544 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 root 20 0 456789 45678 2348 S 0.0 0.1 0:04.23 /usr/local/go-app/main
方法三:使用 htop
工具(可视化增强版)
htop
是 top
的增强版,界面更友好,支持搜索 PID 和彩色显示。
操作步骤:
-
安装
htop
(若未安装):bash
sudo yum install htop -y
-
通过 PID 查找进程:
bash
htop
- 按
F3
(搜索)键,输入 PID 或进程名快速定位。 - 查看
RES
(物理内存)和%MEM
列。
- 按
方法四:使用 pmap
命令(查看内存映射详情)
pmap
可显示进程的内存映射关系,包括各段内存的地址、大小和类型。
命令格式:
bash
pmap <PID>
示例:
bash
pmap 12345
输出片段:
plaintext
12345: /usr/local/go-app/main
000055b4a8c00000 44K r-x-- main
000055b4a8d0b000 4K r---- main
000055b4a8d0c000 4K rw--- main
00007f2a4c000000 1988K r-x-- libc-2.28.so
...
total kB 45678
- 每一行代表一个内存段(如可执行代码、数据段、共享库等)。
-
total kB
:进程占用的总内存(与ps
中的 RSS 接近)。
方法五:通过 /proc
文件系统(底层查看)
Linux 系统将进程信息存储在 /proc/<PID>
目录中,可直接读取内存相关文件。
1. 查看 status
文件(简洁版):
bash
cat /proc/<PID>/status | grep -E "VmRSS|VmSize|%MEM"
-
输出示例:
plaintext
VmRSS: 45678 kB # 常驻内存(物理内存) VmSize: 456789 kB # 虚拟内存总量
2. 查看 smaps
文件(详细版):
bash
cat /proc/<PID>/smaps | grep "Size" -A 5 # 查看各内存段大小
- 可获取每个内存区域的具体占用(如堆、栈、共享库等)。
方法六:使用 Go 内置的 pprof
(精准分析内存结构)
如果是 Go 应用自身,可以通过 pprof
包获取更细致的内存数据(如堆内存分配、GC 状态等)。
前提条件:
在代码中导入 net/http/pprof
并启动 HTTP 服务(见 前文方法三)。
命令示例:
-
查看当前堆内存使用量:
bash
curl http://localhost:6060/debug/pprof/heap | grep "in use"
输出类似:
plaintext
inuse_space: total: 12345678 bytes
-
分析内存分配热点:
bash
go tool pprof -inuse_space http://localhost:6060/debug/pprof/heap (pprof) top 10 # 显示前 10 个内存占用函数
关键概念区分
-
RSS
(常驻内存):进程实际占用的物理内存(已分配且正在使用)。 -
VSS
(虚拟内存):进程申请的虚拟内存总量(包含未实际分配的部分,通常大于 RSS)。 -
Go 应用的内存特点:Go 的垃圾回收(GC)会自动管理堆内存,因此需关注 堆内存增长趋势(通过
pprof
分析),而非单纯看 RSS。
总结:按场景选择工具
场景 | 推荐工具 | 优势 |
---|---|---|
快速查看当前占用 |
ps / pmap
|
命令简单,直接输出结果 |
实时动态监控 |
top / htop
|
可视化界面,支持实时刷新 |
深度性能分析 | pprof |
精准到函数级别的内存分布 |
系统级底层查看 |
/proc 文件系统 |
访问内核级进程信息 |
根据需求选择合适的工具,若需长期监控或告警,可结合 Prometheus + Grafana 等工具构建监控体系。