Linux VIRT
在 Linux CentOS 系统中,VIRT
(虚拟内存)、RES
(常驻内存)和 SHR
(共享内存)是 top
命令中三个关键的内存指标,理解它们的概念和联系对系统监控、性能调优和内存泄漏排查至关重要。以下是三者的详细解释及关联分析:
1. VIRT(Virtual Memory Size,虚拟内存)
-
定义
:进程可访问的总虚拟内存空间
,包括:- 代码段、数据段、堆(
malloc/new
分配)、栈空间。 - 共享库(如
libc.so
)及文件映射(mmap
)。 -
已申请但未实际使用的内存
(如未写入的malloc
分配)。
- 代码段、数据段、堆(
-
特点
:-
按需增长
:若进程申请 1GB 内存但仅写入 100MB,VIRT
仍增加 1GB。 -
不直接消耗物理内存
:仅表示地址空间范围,实际占用由RES
体现。 -
公式
:VIRT = SWAP + RES
(SWAP
是换出到磁盘的部分)。
-
2. RES(Resident Memory Size,常驻内存)
-
定义
:进程当前实际占用的物理内存
(未被换出到 Swap),包括:- 正在使用的堆、栈、代码段。
- 共享库中
已被加载到物理内存的部分
。
-
特点
:-
反映真实资源消耗
:直接影响系统的物理内存压力。 -
按实际使用量增长
:若仅写入申请的 100MB 内存,RES
仅增长 100MB。 -
包含共享内存
:RES
中的一部分可能被多个进程共享(即SHR
)。 -
公式
:RES = CODE + DATA
(代码段 + 数据段)。
-
3. SHR(Shared Memory,共享内存)
-
定义
:RES
中被其他进程共享的内存
,例如:- 共享库(如
glibc
)的代码段。 - 通过
shmget
或mmap(MAP_SHARED)
创建的共享内存区域。
- 共享库(如
-
特点
:-
非独占性
:多个进程共享同一物理内存页,减少整体内存占用。 -
统计粒度
:即使进程仅使用共享库的少量函数,SHR
仍统计整个库的大小。 -
可被换出
:Swap 操作后SHR
可能降低。
-
三者的联系与区别
指标 | 本质 | 是否独占物理内存 | 与物理内存的关系 |
---|---|---|---|
VIRT | 虚拟地址空间总量 | 否 | 包含未映射到物理内存的部分 |
RES | 实际使用的物理内存 | 是(含共享部分) | 直接反映物理内存占用 |
SHR | RES 中的共享部分 | 否 | 被多个进程共享,减少物理内存重复占用 |
-
核心关系
:-
:RES
是VIRT
的子集RES
仅包含VIRT
中已映射到物理内存的部分。 -
:共享内存属于SHR
是RES
的子集RES
,但被多个进程复用。 -
进程独占内存计算公式
:
。独占内存 = RES - SHR
-
如何理解真实内存使用?
-
识别内存瓶颈
:-
:进程实际占用物理内存多,可能导致系统 OOM(Out-of-Memory)。RES
过高 -
:进程申请了大量未使用内存(如预分配未写入),通常无需立即优化。VIRT
远大于RES
-
-
共享内存优化
:- 高
SHR
表示共享库使用多,多个进程可复用同一库
,降低整体内存压力。例如,10 个进程共享 100MB 的libc.so
,SHR
总计仍为 100MB 而非 1GB。
- 高
-
内存泄漏排查
:- 若
RES - SHR
(独占内存)持续增长,可能存在内存泄漏
(如未释放的堆分配)。 VIRT
异常增长但RES
不变,可能是虚拟地址空间碎片化
问题。
- 若
-
Swap 影响
:RES
不包括已换出的内存(属于VIRT
中的SWAP
部分),高 Swap 使用会拖慢性能
。
实践建议
-
监控命令
:top -p PID # 查看进程的 VIRT/RES/SHR cat /proc/PID/smaps # 分析内存详细分布(堆、栈、共享库等)
-
调优场景
:-
优化
:减少不必要的缓冲区或缓存(如调整RES
malloc
策略)。 -
利用
:尽量使用动态链接库而非静态编译,节省物理内存。SHR
-
控制
:避免过度预分配内存(如 Java 的VIRT
-Xmx
设置过大)。
-
总结
-
:进程的“内存需求潜力”,VIRT
关注申请量
。 -
:系统的“真实内存负担”,RES
监控实际使用量
。 -
:系统的“内存复用效率”,SHR
优化共享资源
。
通过分析 RES - SHR
可锁定进程独占内存的异常增长,结合 smaps
文件可深入分析堆、文件映射等区域的使用细节,为性能优化提供精准依据。
评论