核心代碼
getMemorySize = function(exefile) { // 支持正則匹配進程名
import process;
// 導入 PSAPI.GetProcessMemoryInfo
GetProcessMemoryInfo = ::Psapi.api("GetProcessMemoryInfo", "int(pointer hProcess, struct& ppsmemCounters, int cb)");
// 定義 PROCESS_MEMORY_COUNTERS 結構
PROCESS_MEMORY_COUNTERS = class {
int cb;
int PageFaultCount;
int PeakWorkingSetSize; // 物理內存峰值
int WorkingSetSize; // 當前物理內存 (工作集大小)
int QuotaPeakPagedPoolUsage;
int QuotaPagedPoolUsage;
int QuotaPeakNonPagedPoolUsage;
int QuotaNonPagedPoolUsage;
int PagefileUsage; // 虛擬內存大小
int PeakPagefileUsage; // 虛擬內存峰值
}
mem = PROCESS_MEMORY_COUNTERS();
for processEntry in process.each(exefile) {
prc = process(processEntry.th32ProcessID);
try {
GetProcessMemoryInfo(prc.handle, mem, raw.sizeof(mem));
io.print(processEntry.szExeFile + " 內存使用:", mem.WorkingSetSize / 1024 ++ " KB");
}
}
}
io.open();
getMemorySize(".*.exe"); // 列出所有進程內存佔用
關鍵字段解讀
| 字段 | 含義 | 典型用途 |
| WorkingSetSize | 當前物理內存佔用 (工作集) | 實時監控內存佔用 |
| PeakWorkingSetSize | 物理內存峰值 | 分析內存尖峰 |
| PagefileUsage | 當前虛擬內存佔用 | 頁面文件壓力評估 |
| PeakPagefileUsage | 虛擬內存峰值 | 最大提交記憶體 |
技術細節
- 使用
::Psapi.api 動態導入系統 DLL 函數,無需靜態鏈接。
raw.sizeof(mem) 自動計算結構體大小,避免手工對齊錯誤。
process.each 內建快照遍歷,支持正則過濾進程名。
- 異常捕獲
try 保證單個進程失敗不影響整體枚舉。
應用場景
- 性能基線測試:記錄關鍵服務長期運行內存曲線
- 內存洩漏定位:定期採樣對比 WorkingSetSize 增長趨勢
- 自動化運維:超閾值觸發告警或自動重啟