前言
在使用 Windows 系统时,有时会遇到一些不明原因的高内存占用,比如像 vmmemMDAG
这样的过程占用了大量系统资源,却找不到具体原因。这时候,Windows 自带的任务管理器和资源监视器并不能提供足够详细的信息。
一、什么是 Process Explorer?
Process Explorer 是由 Sysinternals 提供的一款免费工具,用于替代任务管理器,帮助用户更详细地了解和管理系统中的进程。
它的主要功能包括:
- 实时监控系统进程:
- 查看进程的详细信息,包括 PID(进程 ID)、内存占用、CPU 使用率等。
- 展示父子进程关系,方便了解进程的来源。
- 深入分析句柄和 DLL:
- 查找某个进程打开了哪些文件或网络连接。
- 查看进程加载的 DLL 文件以及它们的路径。
- 替代任务管理器:
- 提供比任务管理器更详细的功能,比如悬浮窗口查看每个窗口的进程。
- 终止和挂起进程:
- 支持强制终止进程,或挂起某个进程以观察行为。
二、什么是 Process Monitor?
Process Monitor 是一款功能强大的 Windows 诊断工具,它可以实时监视以下活动:
- 文件系统活动(文件读取/写入/创建/删除等)
- 注册表活动(读取/修改/创建/删除等)
- 过程和线程活动(启动/停止/挂起等)
通过 Process Monitor,你可以:
- 深入分析过程的行为。
- 查看过程加载的模块、路径和相关操作。
- 找出系统资源异常占用的根本原因。
三、如何下载和安装 Process Explorer
Process Explorer 是一个便携式工具,无需安装。
访问微软官方 Sysinternals 网站:https://learn.microsoft.com/zh-cn/sysinternals/
点击 “Download Process Explorer” 下载工具包。
解压文件后,运行
procexp.exe
即可启动工具。
四、Process Explorer 的主要功能与界面介绍
启动 Process Explorer 后,界面主要分为以下几个部分:
1. 菜单栏
包含以下主要功能:
- File:用于退出工具或保存当前视图。
- Options:配置显示内容,比如显示 CPU 使用率历史。
- View:切换不同的视图模式,例如句柄、DLL。
- Find:快速查找与某个文件或句柄相关的进程。
2. 工具栏
提供快速访问的功能按钮,包括暂停监控、刷新数据等。
3. 进程树(Process Tree)
- 显示当前运行的所有进程,按照父子关系组织。
- 每个进程会展示其名称、CPU 和内存使用情况。
4. 下部详细信息视图
根据选项显示句柄(Handles)或 DLL 信息。
- Handles:查看进程打开的文件句柄或设备。
- DLLs:列出进程加载的动态链接库。
五、使用 Process Explorer 深度排查问题
通过 Process Explorer,用户可以更深入地管理和分析系统进程,快速定位资源占用问题的根源。
1. 搜索特定进程
当你要排查某个过程(例如 vmmemMDAG
)时,首先设置过滤器,避免信息过轻。
设置方法:
搜索特定进程:可以按 Ctrl + F 搜索特定进程,例如 vmmemMDAG,并查看它的详细路径、父进程等信息。
查看进程属性:右键点击任意进程,选择“Properties”(属性),查看进程的详细信息,包括内存使用情况、文件路径等。
这样,Process Explorer 就会只显示与vmmemMDAG
相关的活动,便于分析。Vid.sys
Vid.sys 是Hyper-V 虚拟化服务驱动,主要用于虚拟机的管理与视频显示相关功能。某些依赖 Hyper-V 的功能(例如 WSL2、Docker Desktop)可能自动启用了虚拟化功能。vmbus.sys
vmbus.sys 是虚拟机总线驱动,用于虚拟机内部通信和与宿主机的资源分配。
2. 排查 Hyper-V
即便你没有手动启用 Hyper-V,Windows 某些组件(如 WSL2、虚拟桌面等)可能会隐式启用它。
运行以下命令查看 Hyper-V 状态:
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
如果显示为 Enabled,可以暂时禁用它:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
3.检查 WSL2 状态
WSL2 默认使用 vmmem
进行虚拟化。即使 WSL 服务停止,但相关虚拟化进程可能未清理。
在 PowerShell 执行以下命令查看 WSL2 状态:
wsl --list --verbose
如果存在正在运行的分发版,尝试停止所有 WSL2 进程:
wsl --shutdown
4.检查 Docker Desktop 或其他虚拟化工具
如果安装了 Docker Desktop,它可能隐式启用了 Hyper-V 或 WSL2:
- 关闭 Docker Desktop 并完全退出。
- 检查其他虚拟化工具(如 VirtualBox、VMware 等)是否正在运行。
5. 禁用不必要的虚拟化功能
在 Windows 功能 设置中禁用虚拟化相关功能:
- 搜索 “Windows 功能”。
- 禁用以下功能:
- Hyper-V
- Windows 虚拟机平台
- 虚拟机监控程序平台
6. 重启系统
完成上述步骤后,重启系统,确认 vmmemMDAG
是否依然占用高内存。
7. 使用 Process Monitor 进一步分析
如果以上步骤无效,可以使用 Process Monitor(另一个 Sysinternals 工具)进行深入诊断:
设置过滤器,筛选出与 vmmemMDAG 进程相关的文件和注册表活动。
- Column: Process Name
- Condition: is
- Value: vmmemMDAG
分析该进程的行为,确定它是由哪个程序触发的。
- 观察 Path 列,查看过程访问的文件路径或注册表项。
- 分析 Operation 列,例如
ReadFile
、CreateFile
、RegQueryValue
等操作。 - 如果过程反复访问某个文件或注册表项,这可能是内存占用或性能问题的关键线索。
六、查看并关闭不需要的服务
通过 Process Monitor 排查后,如果发现高内存占用与虚拟化或容器服务相关,可以通过 PowerShell 查看并关闭这些服务。
1. 查看正在运行的服务
执行以下 PowerShell 命令查看正在运行的服务:
Get-Service | Where-Object {$_.Status -eq 'Running'}
2. 常见虚拟化相关服务
服务名称 | 功能说明 |
---|---|
HvHost |
Hyper-V 主机服务。 |
vmcompute |
Hyper-V 主机计算服务。 |
wix burn |
操作 Burn 引导程序(如提取内容、重新附加等)。 |
hvsics |
应用程序防护容器服务。 |
3. 使用 PowerShell 停止并禁用服务
使用以下命令停止和禁用服务:
# 停止并禁用 HvHost 服务
Stop-Service -Name HvHost -Force
Set-Service -Name HvHost -StartupType Disabled
# 停止并禁用 vmcompute 服务
Stop-Service -Name vmcompute -Force
Set-Service -Name vmcompute -StartupType Disabled
# 停止并禁用 CmService 服务
Stop-Service -Name CmService -Force
Set-Service -Name CmService -StartupType Disabled
# 停止并禁用 hvsics 服务
Stop-Service -Name hvsics -Force
Set-Service -Name hvsics -StartupType Disabled
4. 解决服务停止失败的问题
如果服务无法停止,通应该服务存在依赖服务,可以先查看它的依赖:
Get-Service -Name <依赖服务名> -DependentServices
逐一禁用依赖服务:
Get-Service -Name <依赖服务名> -DependentServices | ForEach-Object {
Stop-Service -Name $_.Name -Force
Set-Service -Name $_.Name -StartupType Disabled
}
停止所有依赖的服务,然后重新停止此服务。例如:
Stop-Service -Name <依赖服务名> -Force
Set-Service -Name <依赖服务名> -StartupType Disabled
5. 验证服务禁用状态
在禁用服务后,可以使用以下命令确认状态:
Get-Service -Name HvHost, vmcompute, CmService, hvsics | Format-Table -Property Name, Status, StartType
确认所有不需要的服务已处于 Stopped 状态,并将启动类型设置为 Disabled。
6. 重启系统
执行上述命令后,请重启计算机,以确保所有相关的服务停止并禁用。
七、总结
在解决 Windows 系统内存占用过高的问题时,我们可以结合以下三种工具与方法,逐步排查问题的根源。
1. Process Explorer
适用场景:需要实时监控系统进程、分析 CPU 和内存占用、以及查找 DLL 或句柄信息。
主要功能:
- 查看每个进程的 CPU 和内存使用情况。
- 分析进程树,明确父子进程关系。
- 检查进程加载的 DLL 或打开的句柄。
- 强制终止或挂起问题进程。
使用建议:
- 当你发现某个进程占用资源过高时,使用 Process Explorer 查看其详细信息,例如启动路径、打开的句柄等。
2. Process Monitor
适用场景:需要深入分析系统的文件、注册表、线程等低层活动。
主要功能:
- 监控文件系统和注册表的访问记录。
- 捕获进程启动、停止等操作。
- 过滤特定进程或事件,快速定位问题行为。
使用建议:
- 使用过滤器专注于特定的进程(例如
vmmemMDAG
)。 - 查看进程的文件、注册表访问行为,找到异常占用内存的关键点。
- 保存监控日志以便后续分析。
3. 查看并管理运行的服务
适用场景:需要检查和关闭可能导致高内存占用的服务。
主要功能:
- 查看系统中正在运行的服务。
- 停止和禁用不必要的服务(如 Hyper-V、WSL2 相关服务)。
- 检查服务依赖关系,解决无法停止服务的问题。
使用建议:
- 通过 PowerShell 查看正在运行的服务:
Get-Service | Where-Object {$_.Status -eq 'Running'}
- 停止与虚拟化相关的服务,如
HvHost
、vmcompute
等。 - 在 “Windows 功能” 中禁用不必要的虚拟化功能。
八、最佳实践
通过合理使用上述工具和方法,高效解决系统中的高内存占用问题,让系统运行更加顺畅。
结合使用三种方法:
- 使用 Process Explorer 发现问题进程。
- 使用 Process Monitor 深入分析问题行为(如文件和注册表操作)。
- 使用 PowerShell 停止不必要的服务,减少系统负担。
逐步排查和验证:
- 每完成一个排查步骤后,观察系统内存占用是否有所改善。
- 在确认问题解决后,保存配置,避免问题复发。