那虻 发表于 2025-7-30 15:28:50

Linux VIRT-RES-SHR内存概念理解

在 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实际使用的物理内存是(含共享部分)直接反映物理内存占用SHRRES 中的共享部分否被多个进程共享,减少物理内存重复占用

[*]​​核心关系​​:

[*]​​RES 是 VIRT 的子集​​:RES 仅包含 VIRT 中已映射到物理内存的部分。
[*]​​SHR 是 RES 的子集​​:共享内存属于 RES,但被多个进程复用。
[*]​​进程独占内存计算公式​​:​​独占内存 = RES - SHR​​。

​​如何理解真实内存使用?​​


[*]​​识别内存瓶颈​​:

[*]​​RES 过高​​:进程实际占用物理内存多,可能导致系统 OOM(Out-of-Memory)。
[*]​​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​​:尽量使用动态链接库而非静态编译,节省物理内存。
[*]​​控制 VIRT​​:避免过度预分配内存(如 Java 的 -Xmx 设置过大)。

​​总结​​


[*]​​VIRT​​:进程的“内存需求潜力”,​​关注申请量​​。
[*]​​RES​​:系统的“真实内存负担”,​​监控实际使用量​​。
[*]​​SHR​​:系统的“内存复用效率”,​​优化共享资源​​。
通过分析 RES - SHR 可锁定进程独占内存的异常增长,结合 smaps 文件可深入分析堆、文件映射等区域的使用细节,为性能优化提供精准依据。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Linux VIRT-RES-SHR内存概念理解