内存越用越少怎么查
内存问题要讲量化:先看总量与可用内存,再找增长最快的进程,最后区分是系统缓存占用、一次性膨胀,还是真正的泄漏。先把数据拿全再动手,避免凭感觉重启。
基本信息
| 适用平台 | Windows,PowerShell 与性能监视器均可 |
|---|---|
| 总量来源 | Win32_OperatingSystem 的 TotalVisibleMemorySize 与 FreePhysicalMemory,单位为 KB |
| 进程排行 | Get-Process 按 WorkingSet64 或 PrivateMemorySize64 排序 |
| 泄漏判据 | 私有内存持续单调增长且回收无效 |
| 辅助工具 | 性能监视器计数器、资源监视器内存标签页 |
| 更贴近压力的指标 | 提交量比可用内存更能反映真实紧张程度 |
排查步骤
- 1. 看总体可用内存与提交量,判断是紧张还是已被系统缓存占用
- 2. 按内存排序找出占用最大的几个进程,先排除已知的大户
- 3. 间隔采样同一进程,看它是稳定还是持续增长
- 4. 区分内存性质:文件缓存可释放,私有内存持续增长才像泄漏
- 5. 结合业务日志确认是否伴随报错或变慢,避免误重启
常用示例
常用示例
# 总体可用内存,FreePhysicalMemory 单位是 KB
$os = Get-CimInstance Win32_OperatingSystem
'{0:N0} MB 可用' -f ($os.FreePhysicalMemory / 1KB)
# 已提交的虚拟内存总量
'{0:N0} MB 已提交' -f (($os.TotalVirtualMemorySize - $os.FreeVirtualMemory) / 1KB)
# 内存占用前几名,同时看工作集与私有内存
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 Name, @{n='工作集MB';e={[math]::Round($_.WorkingSet64/1MB)}}, @{n='私有MB';e={[math]::Round($_.PrivateMemorySize64/1MB)}}
# 间隔采样同一进程,观察趋势
Get-Process -Name mysvc | Select-Object Name, @{n='私有MB';e={[math]::Round($_.PrivateMemorySize64/1MB)}}指标读法
| 指标 | 含义 | 判断要点 |
|---|---|---|
| 可用物理内存 | 当前空闲的物理内存(KB) | 低不等于异常,系统会主动用内存做缓存 |
| 提交量 | 已提交的虚拟内存总量 | 比可用内存更能反映真实压力 |
| 工作集 | 进程驻留的物理内存 | 含共享内存,跨进程相加会重复计算 |
| 私有内存 | 进程独占的提交内存 | 持续增长才指向泄漏 |
| 分页文件使用 | 换页活动强度 | 大量换页会让系统明显变慢 |
Windows 会用空闲内存做文件缓存,可用内存偏低并不代表有故障。要判断是否真的紧张,应同时看提交量、换页活动与业务响应时间。
不同内存规格的机器缓存策略不同,做横向对比要选配置相近的机器,否则容易把正常的缓存差异误判成异常。