导读:本期聚焦于Robin创作的《内存泄漏排查总搞不定?RAMMap 工具从物理内存视角揪出元凶》,敬请观看详情。内存占用持续升高,任务管理器却看不出哪个进程在泄漏?这通常是因为泄漏发生在内核池、映射文件或页表等容易被忽略的区域。RAMMap 是 Sysinternals 提供的一款免费内存分析工具,它不依赖性能计数器,而是直接读取物理内存分配快照,从使用类型、进程、文件、优先级四个维度展示内存去向。本文将介绍 RAMMap 的核心视图、常见泄漏场景的识别方法,以及如何结合 Empty 菜单与命令行参数快速定位异常内存增长。通过实际案例你会看到,一个看似普通的进程可能通过映射文件或驱动程序长期占用大量物理页,而 RAMMap 能把这类隐藏问题一目了然地呈现出来。

一台 Windows 服务器运行一段时间后,任务管理器显示可用内存只剩下几十 MB,但把所有进程的工作集加起来却远小于物理内存总量。这种内存凭空消失的现象往往与内核池、页表、映射文件等非进程私有内存有关。Sysinternals 出品的 RAMMap 正是为这类问题设计的分析工具。它不读取性能计数器,而是直接获取系统物理内存分配快照,可以按使用类型、进程、文件、优先级等维度展示每一页内存被谁占用。对于经常需要处理内存异常增长、排查驱动泄漏或分析文件映射占用的工程师来说,RAMMap 提供了一个比任务管理器更底层的观察窗口。

内存泄漏排查总搞不定?RAMMap 工具从物理内存视角揪出元凶

RAMMap 的四个核心视图与数据来源

启动 RAMMap 后,界面顶部会显示多个标签页,其中最重要的是 Use Counts、Processes、Priority Summary 和 Physical Pages。Use Counts 视图按内存使用类型汇总当前物理内存,例如 Process Private 表示进程私有内存,Mapped File 表示文件映射占用的内存,Shared Memory 表示共享内存,Page Table 表示页表本身消耗的内存,Paged Pool 和 Nonpaged Pool 分别对应可分页内核池和不可分页内核池。Session Private、Driver、AWE 等类型也都有独立计数。这个视图的意义在于:如果某一个类型的内存长期只增不减,就能直接缩小排查范围。

Processes 视图以进程为单位展示各进程的内存占用,但它与任务管理器不同,RAMMap 会把进程的内存拆得更细。你可以看到某个进程有多少内存在工作集里,有多少是私有页面,有多少来自映射文件,还有多少是内核态分配。Priority Summary 则按内存优先级(如 Standby、Modified、Active)汇总页面数量,帮助判断系统缓存和待写入页面的大小。Physical Pages 视图最底层,它把每一页物理内存的地址、状态、所属进程或文件都列出来,适合做最终确认。

RAMMap 的数据来源不是性能计数器,而是调用 Windows 内部的内存管理器接口,获取系统级物理页数据库快照。这意味着它能看到性能监视器无法覆盖的区域,例如内核池、页表、驱动映射等。也正因为读取的是系统快照,RAMMap 需要管理员权限才能运行,而且在某些受限环境中可能无法完整加载。

用 Use Counts 定位内核与驱动内存泄漏

排查内存泄漏的第一步通常不是直接看进程,而是打开 Use Counts 视图,观察各类内存的总量变化。如果 Nonpaged Pool 或 Paged Pool 持续增长,基本可以确定是内核模式驱动或系统组件在泄漏。Nonpaged Pool 尤其值得关注,因为它永远驻留物理内存,不能换出到磁盘,一旦泄漏会迅速耗尽可用内存。此时需要结合驱动加载列表和近期安装的软件来判断,RAMMap 本身不会直接告诉你是哪个驱动,但它能确认泄漏发生在内核池。

Mapped File 增长异常则常见于应用程序频繁创建文件映射或加载大文件后未正确释放。例如某些数据库或缓存服务会使用内存映射文件管理数据,如果映射视图没有及时关闭,物理内存中的 Mapped File 页面就会不断增加。使用 RAMMap 时,可以先记录一次快照,过一段时间再记录一次,对比 Mapped File 的增量。如果增量主要来自某个文件,再进入 Physical Pages 视图按文件名排序,很快就能找到对应的映射文件。

以下命令可以帮助你在固定时间间隔内自动导出 RAMMap 快照,方便后续在 GUI 中对比前后差异。

:: 使用 RAMMap 命令行参数导出快照,注意路径中的反斜杠必须保留
RAMMap.exe -e C:\temp\snapshot_before.rmp
:: 等待 5 分钟,观察内存变化
timeout /t 300
RAMMap.exe -e C:\temp\snapshot_after.rmp

导出的文件可以用 RAMMap 再次打开,通过 File 菜单中的 Load 加载快照,然后切换 Use Counts 标签页逐个对比计数。虽然这种方法不如专业监控工具实时,但在定位偶发性增长时非常实用。命令行参数 -e 后面跟的是保存路径,文件名可以自己定义,但不能省略盘符和反斜杠。

结合 Process 与 Physical Pages 视图追踪异常进程

如果 Use Counts 显示增长主要集中在 Process Private 或某个进程的 Mapped File,就可以切换到 Processes 视图进一步分析。按某一列排序后,观察哪些进程的 Private WS、Mapped WS 或 Page Table 数值异常高。这里要注意,任务管理器中的工作集只反映当前物理内存占用,而 RAMMap 能显示进程的映射文件、私有页面和内核页表分别占了多少。例如一个进程工作集只有 200 MB,但 Page Table 却占了 800 MB,这通常意味着该进程创建了大量小的虚拟内存区域,可能是碎片化分配导致的页表膨胀。

Physical Pages 视图适合做最终定位。你可以先按进程名或文件名筛选,然后查看某一类页面的具体状态。比如某个 DLL 或数据文件被映射到多个进程,占用了大量物理页,而这些页面的状态是 Standby 还是 Active 会直接影响系统回收效率。Standby 页面属于缓存,内存压力大时可以被回收,Active 页面则是正在被使用。如果发现大量 Active 页面属于一个已经不再活跃的进程,就说明该进程可能没有正确释放映射或句柄。

下面这段 PowerShell 脚本可以粗略估算所有进程工作集总和与物理内存总量的差值,这个差值通常对应内核池、页表、驱动等非进程私有内存。配合 RAMMap 使用,可以判断问题是否出在进程之外。

# 获取所有进程工作集总和,单位换算为 MB
$totalWS = (Get-Process | Measure-Object -Property WorkingSet64 -Sum).Sum / 1MB
Write-Output ('所有进程工作集总和: ' + [math]::Round($totalWS, 2) + ' MB')
# 获取物理内存总量
$totalRAM = (Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1MB
Write-Output ('物理内存总量: ' + [math]::Round($totalRAM, 2) + ' MB')
# 如果差值持续扩大,建议用 RAMMap 查看 Use Counts 中的内核池和页表项目

该脚本并不能替代 RAMMap,但可以快速判断泄漏是否来自用户态进程。如果差值很小,而可用内存仍持续下降,问题可能出在某个用户态进程的映射文件或私有内存;如果差值很大,就需要重点排查内核池和驱动。

RAMMap 的 Empty 菜单与操作注意事项

RAMMap 顶部菜单栏中有一个 Empty 选项,包含 Empty Working Sets、Empty System Working Set、Empty Modified Page List、Empty Standby List 等命令。这些命令可以立即清空对应类型的内存页面,帮助验证内存是否真的被泄漏,还是只是被系统缓存占用。例如 Standby List 中存放的是系统预读和已经写回磁盘的缓存页,正常情况下内存压力高时会被自动释放。如果手动清空 Standby List 后可用内存大幅回升,说明这些页面是正常缓存,不属于泄漏。

Empty Working Sets 会强制所有进程放弃工作集,把页面转移到 Standby 或 Modified 列表。如果一个进程在清空工作集后立刻又迅速占用大量内存,并且持续增长,这个进程就很可疑。Empty Modified Page List 则会立即把修改过的页面写入磁盘,这会导致磁盘 I/O 突然升高,所以在生产环境执行这些操作前要谨慎评估。尤其不要频繁清空 Modified Page List,否则可能影响数据一致性和系统性能。

日常使用 RAMMap 时,建议先做一次快照记录基准,再按固定间隔观察。不要一上来就执行 Empty 操作,因为这会打乱内存状态,反而掩盖真实问题。对于服务器环境,可以在非高峰时段进行短时间监控,并结合 Windows 事件日志和驱动加载记录综合判断。RAMMap 本身是只读分析工具,不会主动修改系统内存分配,只有在手动点击 Empty 菜单时才会触发回收动作。

RAMMap 的价值在于把物理内存的每一页都摊开来看,让那些隐藏在进程列表之外的内存占用无处可藏。无论是内核池泄漏、映射文件膨胀,还是页表碎片化,只要掌握了 Use Counts 和 Physical Pages 视图的使用方法,就能大幅缩短内存问题的定位时间。

RAMMap内存泄漏物理内存分析修改时间:2026-08-23 19:37:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。