Linux VIRT

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 + RESSWAP 是换出到磁盘的部分)。

​2. RES(Resident Memory Size,常驻内存)​

  • ​定义​

    ​:进程当前​

    ​实际占用的物理内存​

    ​(未被换出到 Swap),包括:

    • 正在使用的堆、栈、代码段。
    • 共享库中​

      ​已被加载到物理内存的部分​

      ​。
  • ​特点​

    ​:

    • ​反映真实资源消耗​

      ​:直接影响系统的物理内存压力。
    • ​按实际使用量增长​

      ​:若仅写入申请的 100MB 内存,RES 仅增长 100MB。
    • ​包含共享内存​

      ​:RES 中的一部分可能被多个进程共享(即 SHR)。
    • ​公式​

      ​:RES = CODE + DATA(代码段 + 数据段)。

​3. SHR(Shared Memory,共享内存)​

  • ​定义​

    ​:RES 中​

    ​被其他进程共享的内存​

    ​,例如:

    • 共享库(如 glibc)的代码段。
    • 通过 shmgetmmap(MAP_SHARED) 创建的共享内存区域。
  • ​特点​

    ​:

    • ​非独占性​

      ​:多个进程共享同一物理内存页,减少整体内存占用。
    • ​统计粒度​

      ​:即使进程仅使用共享库的少量函数,SHR 仍统计整个库的大小。
    • ​可被换出​

      ​:Swap 操作后 SHR 可能降低。

​三者的联系与区别​

​指标​

​本质​

​是否独占物理内存​

​与物理内存的关系​

VIRT 虚拟地址空间总量 包含未映射到物理内存的部分
RES 实际使用的物理内存 是(含共享部分) 直接反映物理内存占用
SHR RES 中的共享部分 被多个进程共享,减少物理内存重复占用
  • ​核心关系​

    ​:
    • RESVIRT 的子集​

      ​:RES 仅包含 VIRT 中已映射到物理内存的部分。
    • SHRRES 的子集​

      ​:共享内存属于 RES,但被多个进程复用。
    • ​进程独占内存计算公式​

      ​:​

      独占内存 = RES - SHR

      ​。

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

  1. ​识别内存瓶颈​

    ​:

    • RES 过高​

      ​:进程实际占用物理内存多,可能导致系统 OOM(Out-of-Memory)。
    • VIRT 远大于 RES

      ​:进程申请了大量未使用内存(如预分配未写入),通常无需立即优化。
  2. ​共享内存优化​

    ​:

    • SHR 表示共享库使用多,​

      ​多个进程可复用同一库​

      ​,降低整体内存压力。例如,10 个进程共享 100MB 的 libc.soSHR 总计仍为 100MB 而非 1GB。
  3. ​内存泄漏排查​

    ​:

    • RES - SHR(独占内存)持续增长,可能​

      ​存在内存泄漏​

      ​(如未释放的堆分配)。
    • VIRT 异常增长但 RES 不变,可能是​

      ​虚拟地址空间碎片化​

      ​问题。
  4. ​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 文件可深入分析堆、文件映射等区域的使用细节,为性能优化提供精准依据。

评论

昵称
邮箱
主页