基于Ruby实现Windows 10应用内存使用量监控的问题
Windows 10下Ruby监控进程实时内存的可行方案
一、优化sys-proctable的使用逻辑
你之前拿到的working_set_size是进程的工作集大小,而且Chrome是多进程架构,只抓单个进程肯定和实际总占用差很多。sys-proctable还提供了更贴近你需求的内存属性,同时要遍历所有匹配进程累加:
require 'sys/proctable' include Sys target_process = "chrome.exe" total_private_memory = 0 # 遍历所有进程,累加同名进程的独占内存 ProcessTable.ps.each do |proc| total_private_memory += proc.private_bytes if proc.name.downcase == target_process.downcase end # 转换为MB输出 puts "#{target_process}总独占内存: #{(total_private_memory / 1024 / 1024).round(2)} MB"
这里的private_bytes对应任务管理器里的「专用内存」,是进程实际独占的内存资源,比工作集更贴近你要的“实际内存使用量”。
二、用WMI获取和任务管理器一致的数据
通过Ruby的win32ole调用Windows的WMI接口,能拿到和任务管理器完全匹配的内存指标,比如「专用工作集」或「提交大小」:
require 'win32ole' wmi = WIN32OLE.connect("winmgmts://") target_process = "chrome.exe" total_usage = 0 # 查询所有目标进程,累加专用工作集(对应任务管理器的「内存」列) wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '#{target_process}'").each do |proc| total_usage += proc.WorkingSetPrivate.to_i end puts "#{target_process}总内存占用: #{(total_usage / 1024 / 1024).round(2)} MB"
如果需要获取「提交大小」,把WorkingSetPrivate换成PageFileUsage即可。
三、直接调用系统命令解析结果
快速验证的话,可以调用Windows原生的tasklist命令,解析输出结果:
target_process = "chrome.exe" # 执行命令获取CSV格式的进程详情 output = `tasklist /fi "imagename eq #{target_process}" /v /fo csv` total_mem_kb = 0 # 跳过表头,遍历每一行进程数据 output.split("\n")[1..-1].each do |line| parts = line.split('","') # 提取内存列(CSV第14项,单位KB) mem_kb = parts[13].delete('"').delete(',').to_i total_mem_kb += mem_kb end puts "#{target_process}总内存使用: #{(total_mem_kb / 1024).round(2)} MB"
关键注意点
- Chrome是多进程架构,必须统计所有同名进程的内存总和,才能得到浏览器实际的总内存占用
- 不同内存指标对应任务管理器的不同列,根据你的监控需求选择对应属性即可
内容的提问来源于stack exchange,提问作者PepeFortes
相关产品推荐
相关产品推荐

