内存占用定位
定位内存占用大的一般做法是按工作集排序找出排名靠前的进程。Get-Process 的 WorkingSet64 表示进程当前驻留的物理内存,PrivateMemorySize64 表示私有提交内存,两者含义不同:前者包含共享内存,后者更接近该进程自身真实申请的量。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 |
|---|---|
| 核心命令 | Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 |
| 关键字段 | WorkingSet64 工作集、PrivateMemorySize64 私有提交、PagedMemorySize64 可分页内存、VirtualMemorySize64 虚拟地址空间 |
| 辅助命令 | Get-CimInstance Win32_OperatingSystem 看总可用内存,Measure-Object 做求和 |
| 单位换算 | 除以 1MB 或 1GB 更易读,注意是字节为单位的 64 位属性 |
典型使用场景
- 机器变慢时快速找出占用最大的几个进程
- 服务异常时核对某个进程的内存是否异常膨胀
- 定期巡检采样,对比同一进程在不同时间点的工作集变化
- 估算业务进程总占用,求和后与物理内存规模做对比
- 和 CPU 排序结合,判断当前是内存型还是计算型负载
常用示例
常用示例
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 @{n='进程';e={$_.Name}}, @{n='PID';e={$_.Id}}, @{n='工作集MB';e={[math]::Round($_.WorkingSet64/1MB)}}
# 私有内存排行,更接近进程自身实际申请量
Get-Process | Sort-Object PrivateMemorySize64 -Descending | Select-Object -First 10 Name, @{n='私有MB';e={[math]::Round($_.PrivateMemorySize64/1MB)}}
# 所有进程工作集之和,与物理内存规模对照
(Get-Process | Measure-Object WorkingSet64 -Sum).Sum / 1GB
# 间隔采样同一进程,判断是否持续增长
Get-Process -Name mysvc | Select-Object Name, @{n='工作集MB';e={[math]::Round($_.WorkingSet64/1MB)}}字段读法
| 字段 | 含义 | 正常与异常 |
|---|---|---|
| WorkingSet64 | 进程当前驻留的物理内存 | 含共享内存,简单相加会大于真实占用 |
| PrivateMemorySize64 | 进程私有提交内存 | 持续单调增长才疑似泄漏 |
| PagedMemorySize64 | 可分页内存总量 | 明显大于工作集说明部分已被换出 |
| VirtualMemorySize64 | 虚拟地址空间占用 | 申请大不等同于占用物理内存 |
| CPU | 累计处理器时间(秒) | 要两次采样相减才是利用率 |
工作集包含共享内存,例如各进程共同映射的系统 DLL,把所有进程的工作集相加会超过实际物理占用,估算总量时要注意这部分被重复计入。
内存持续单调增长才像泄漏,稳态偏高未必是问题。数据库与缓存类程序会主动占满空闲内存提高命中率,判断前先了解该程序的内存设计。