Electron MemoryInfo 结构解析:读懂 app.getAppMetrics() 返回的进程内存指标

发布时间:2026/11/12 4:45:56
Electron MemoryInfo 结构解析:读懂 app.getAppMetrics() 返回的进程内存指标 Electron MemoryInfo 结构解析读懂 app.getAppMetrics() 返回的进程内存指标【免费下载链接】electron:electron: Build cross-platform desktop apps with JavaScript, HTML, and CSS项目地址: https://gitcode.com/GitHub_Trending/el/electronElectron 应用由多个进程主进程、渲染进程、GPU、Utility 进程等组成定位内存问题首先要拿到每个进程的真实占用数据。MemoryInfo就是 Electron 进程监控体系中最核心的数据结构它被app.getAppMetrics()返回的 ProcessMetric 对象以memory字段的形态暴露给 JavaScript 层让开发者无需依赖系统工具即可量化各进程的常驻内存、历史峰值以及 Windows 上的私有内存。读完本篇你将掌握MemoryInfo各字段的精确语义与单位、三大平台Windows / macOS / Linux的实现差异并能通过源码确认这些数字的采集来源。MemoryInfo 结构定义MemoryInfo 官方结构文档定义如下workingSetSizeInteger— 当前实际驻留物理内存pinned to physical RAM的内存量peakWorkingSetSizeInteger— 历史上曾经驻留物理内存的最大值privateBytesInteger可选Windows 独有— 不被其他进程共享的内存量例如 JS 堆或 HTML 内容占用的内存。注意所有统计值均以 KilobytesKB为单位。这是该结构最容易被忽略的约束——如果你把数值直接当作字节用于展示或告警阈值误差会是 1024 倍。MemoryInfo并非独立使用它作为 ProcessMetric 的memory字段出现memoryMemoryInfo - The memory information for the process.也就是说每次调用app.getAppMetrics()拿到的ProcessMetric数组中每一个进程条目都附带一份MemoryInfo。获取 MemoryInfoapp.getAppMetrics() 实战在主进程中通过app.getAppMetrics()获取全量进程指标示例如下const { app } require(electron) app.whenReady().then(() { const metrics app.getAppMetrics() for (const metric of metrics) { if (metric.type Browser || metric.type Tab) { console.log( pid${metric.pid} type${metric.type} workingSetSize${metric.memory.workingSetSize}KB peakWorkingSetSize${metric.memory.peakWorkingSetSize}KB ) } } })ProcessMetric.type的取值包括Browser、Tab、Utility、GPU、Zygote等完整列表见 ProcessMetric 文档配合pid与creationTime可以唯一定位一个进程pid在进程退出后可能被系统复用因此文档建议两者结合使用。平台实现差异源码级溯源三个平台的操作系统接口能力不同MemoryInfo各字段的可用性与数据来源因此存在明显差异。以下分析均出自仓库源码。Windows完整三字段process_metric.cc 中 Windows 分支调用 Win32 APIGetProcessMemoryInfo将PROCESS_MEMORY_COUNTERS_EX结构直接映射到三个字段info.WorkingSetSize→workingSetSizeinfo.PeakWorkingSetSize→peakWorkingSetSizeinfo.PrivateUsage→privateBytes这正是文档标注privateBytes为Windows 专属的原因Windows 的任务管理器专用工作集即来自PrivateUsage。macOS无 privateBytesprocess_metric.cc 的 macOS 分支通过 Mach 接口task_info(MACH_TASK_BASIC_INFO)采集info-resident_size→workingSetSizeinfo-resident_size_max→peakWorkingSetSizeMach 的mach_task_basic_info没有私有内存这一概念因此 macOS 上返回的MemoryInfo只包含前两个字段privateBytes缺失。LinuxJS 层从 /proc 读取Linux 下 C 层不提供这两个字段改由 JavaScript 层补全。app.ts 在process.platform linux时包装原生getAppMetrics逐个进程读取/proc/pid/status用正则提取VmRSS当前常驻集→workingSetSizeVmHWM历史最大常驻集High Water Mark→peakWorkingSetSize代码片段摘自 lib/browser/api/app.tsconst patternVmRSS /^VmRSS:\s*(\d) kB$/m const patternVmHWM /^VmHWM:\s*(\d) kB$/m const getProcessMemoryInfo (pid: number) { const file getStatus(pid) // 读取 /proc/pid/status return { workingSetSize: getEntry(file, patternVmRSS), peakWorkingSetSize: getEntry(file, patternVmHWM) } }从源码结构看Linux 分支同样不产生privateBytes——/proc/pid/status中虽无直接对应的私有内存字段Electron 也未在此处合成该值因此该字段在 Windows 之外均应视为可能缺失的可选值消费端代码需做防御性处理。MemoryInfo 与 ProcessMemoryInfo 的区分Electron 有两套容易混淆的内存 API注意不要混用对比项MemoryInfo本文主题ProcessMemoryInfo来源 APIapp.getAppMetrics()主进程process.getProcessMemoryInfo()process 文档、webContents.getProcessMemoryInfo()字段workingSetSize/peakWorkingSetSize/privateBytesresidentSet/private/shared视角对任意进程按 pid的操作系统级指标当前或指定 renderer进程的 resident / private / shared 拆分单位KilobytesKilobytesprocess.getProcessMemoryInfo()返回的ProcessMemoryInfo走的是 Chromium 的内存插桩路径底层实现在 electron_api_web_contents.cc通过memory_instrumentation::MemoryInstrumentation::RequestGlobalDumpForPid请求按 pid 的内存 dump。此外文档特别提示macOS 下 Chromium 不提供residentSet因为系统会压缩近期未访问的内存页private才是更能代表真实用量的字段。做跨 API 对比或监控面板时应明确每个数字出自哪条采集链路。验证测试用例中的断言仓库测试 spec/api-process-spec.ts 对process.getProcessMemoryInfo()的断言可以佐证内存指标的可靠性预期residentSet在 Linux / Windows 上大于 0private大于 0shared允许为 0。这提示我们在消费MemoryInfo时也应有类似的边界意识workingSetSize正常情况下应大于 0若读到 0 往往意味着/proc/pid/status读取失败Linux 分支中getStatus捕获异常后返回空字符串getEntry会解析为 0。小结MemoryInfo的三个字段全部以KB为单位workingSetSize是当前物理内存占用peakWorkingSetSize是历史峰值privateBytes仅 Windows 提供可用于观察 JS 堆、页面内容等不可共享部分Windows 依赖GetProcessMemoryInfomacOS 依赖 Machtask_infoLinux 则在 JS 层解析/proc/pid/status的VmRSS/VmHWM三平台字段可用性不完全一致跨平台代码必须容忍privateBytes缺省MemoryInfo通过ProcessMetric.memory随app.getAppMetrics()返回是构建 Electron 应用进程级内存监控的第一手数据源需要区分它与ProcessMemoryInfoprocess.getProcessMemoryInfo()这两条不同的采集链路。【免费下载链接】electron:electron: Build cross-platform desktop apps with JavaScript, HTML, and CSS项目地址: https://gitcode.com/GitHub_Trending/el/electron创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询