拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门