VIRT
、RES
和 SHR
是 top
命令中的三项指标,用于显示进程的内存使用情况。它们之间的区别如下:
1. VIRT (Virtual Memory Size) - 虚拟内存大小
- 定义:
VIRT
表示进程所能访问的所有虚拟地址空间的总和,包括所有分配但未实际使用的内存。 - 包含内容:
- 进程的代码段。
- 已分配但尚未使用的内存。
- 映射的文件和设备(如内存映射的文件)。
- 动态分配的堆内存。
- 栈内存。
- 共享库(包括共享内存)。
- 意义:
VIRT
包括了进程所有的内存需求,但并不表示进程实际占用了多少物理内存。它反映了进程的虚拟内存使用量的总和。
2. RES (Resident Set Size) - 常驻内存大小
- 定义:
RES
表示进程实际使用的物理内存大小,即该进程当前在物理内存中驻留的部分。 - 包含内容:
- 进程代码段在内存中的实际占用部分。
- 进程堆和栈的实际使用部分。
- 动态分配内存的实际使用部分。
- 共享库中实际被映射到物理内存的部分。
- 意义:
RES
是物理内存中正在被进程实际使用的部分,代表了进程对系统物理内存资源的直接消耗。如果RES
很大,说明该进程在消耗大量的物理内存资源。
3. SHR (Shared Memory Size) - 共享内存大小
- 定义:
SHR
表示进程所使用的共享内存的大小,包括共享库使用的内存和其他进程共享的内存部分。 - 包含内容:
- 共享库占用的内存,如动态链接库(
*.so
)使用的内存。 - 其他进程可能与之共享的内存块。
- 共享库占用的内存,如动态链接库(
- 意义:
SHR
反映了进程所用的可以与其他进程共享的内存量。SHR
中的内存不全是该进程独占的部分,所以即使多个进程显示相同的SHR
,它们之间实际可能共用这些内存。
三者关系总结
-
VIRT
=RES
+ 进程未使用但保留的虚拟内存空间 + 未映射的共享内存VIRT
是整个进程虚拟内存的总和,包含所有潜在的内存使用量。
-
RES
= 实际驻留在物理内存中的内存,包括部分SHR
RES
是实际占用物理内存的部分,代表了进程对物理内存的需求。RES
中可能包含一部分SHR
,因为一些共享内存也是驻留在物理内存中的。
-
SHR
是RES
的一部分SHR
代表了共享的那部分内存,多个进程可以共享SHR
中的内存,因而它不完全反映单个进程的物理内存消耗。
通过理解这三个指标,你可以更好地分析系统中进程的内存使用情况,特别是在优化内存使用和调试性能问题时。