名称: electron-memory-profiler 描述: 分析Electron应用内存使用情况,检测内存泄漏,分析渲染进程内存,并优化内存消耗 允许工具: Read, Write, Edit, Bash, Glob, Grep 标签: [electron, 性能, 内存, 性能分析, 优化]
electron-memory-profiler
分析Electron应用程序内存使用情况,检测内存泄漏,并分析渲染进程内存消耗。此技能提供识别内存问题和优化Electron应用程序内存使用的工具和技术。
能力
- 分析主进程和渲染进程内存使用情况
- 通过堆快照检测内存泄漏
- 分析垃圾回收模式
- 监控V8堆统计信息
- 跟踪DOM节点和事件监听器数量
- 生成随时间变化的内存使用报告
- 识别常见内存泄漏模式
- 提供优化建议
输入模式
{
"type": "object",
"properties": {
"projectPath": {
"type": "string",
"description": "Electron项目根目录路径"
},
"profilingMode": {
"enum": ["snapshot", "timeline", "leak-detection", "comparison"],
"default": "snapshot"
},
"targetProcess": {
"enum": ["main", "renderer", "all"],
"default": "all"
},
"duration": {
"type": "number",
"description": "时间线性能分析的持续时间(秒)",
"default": 60
},
"snapshotInterval": {
"type": "number",
"description": "快照之间的间隔(毫秒)",
"default": 5000
},
"generateReport": {
"type": "boolean",
"default": true
}
},
"required": ["projectPath"]
}
输出模式
{
"type": "object",
"properties": {
"success": { "type": "boolean" },
"memoryProfile": {
"type": "object",
"properties": {
"mainProcess": {
"type": "object",
"properties": {
"heapUsed": { "type": "number" },
"heapTotal": { "type": "number" },
"external": { "type": "number" },
"rss": { "type": "number" }
}
},
"rendererProcesses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"pid": { "type": "number" },
"heapUsed": { "type": "number" },
"domNodes": { "type": "number" },
"eventListeners": { "type": "number" }
}
}
}
}
},
"leaks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": { "type": "string" },
"location": { "type": "string" },
"retainedSize": { "type": "number" },
"count": { "type": "number" }
}
}
},
"recommendations": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["success"]
}
性能分析技术
堆快照分析
// 在主进程中生成堆快照
const v8 = require('v8');
const fs = require('fs');
function takeHeapSnapshot(filename) {
const snapshotPath = `${filename}.heapsnapshot`;
const snapshotStream = v8.writeHeapSnapshot(snapshotPath);
console.log(`堆快照已写入: ${snapshotStream}`);
return snapshotStream;
}
内存监控
// 在主进程中监控内存
function getMemoryUsage() {
const usage = process.memoryUsage();
return {
heapUsed: Math.round(usage.heapUsed / 1024 / 1024),
heapTotal: Math.round(usage.heapTotal / 1024 / 1024),
external: Math.round(usage.external / 1024 / 1024),
rss: Math.round(usage.rss / 1024 / 1024)
};
}
// 通过IPC监控渲染器内存
ipcMain.handle('memory:get-usage', (event) => {
const webContents = event.sender;
return webContents.executeJavaScript(`
({
jsHeapSizeLimit: performance.memory?.jsHeapSizeLimit,
totalJSHeapSize: performance.memory?.totalJSHeapSize,
usedJSHeapSize: performance.memory?.usedJSHeapSize
})
`);
});
渲染器内存分析
// 在预加载脚本中
const memoryAnalysis = {
getDOMNodeCount: () => document.getElementsByTagName('*').length,
getEventListenerCount: () => {
// 近似值 - 需要检测
return window.__eventListenerCount || 0;
},
getDetachedNodes: () => {
// 需要DevTools协议
return [];
}
};
常见内存泄漏模式
1. 事件监听器泄漏
// 错误: 监听器未移除
window.addEventListener('resize', handleResize);
// 组件卸载但监听器仍然存在
// 正确: 适当清理
const controller = new AbortController();
window.addEventListener('resize', handleResize, { signal: controller.signal });
// 清理时:
controller.abort();
2. IPC通道泄漏
// 错误: 累积监听器
ipcRenderer.on('data-update', (event, data) => {
updateUI(data);
});
// 正确: 清理时移除监听器
const handler = (event, data) => updateUI(data);
ipcRenderer.on('data-update', handler);
// 清理时:
ipcRenderer.removeListener('data-update', handler);
3. 闭包泄漏
// 错误: 大对象在闭包中保留
function createHandler(largeData) {
return () => {
console.log(largeData.someProperty); // largeData被保留
};
}
// 正确: 仅提取需要的数据
function createHandler(largeData) {
const property = largeData.someProperty;
return () => {
console.log(property); // 仅保留property
};
}
4. BrowserWindow泄漏
// 错误: 窗口引用被保留
let windows = [];
function createWindow() {
const win = new BrowserWindow({...});
windows.push(win);
}
// 正确: 关闭时清理
function createWindow() {
const win = new BrowserWindow({...});
windows.push(win);
win.on('closed', () => {
windows = windows.filter(w => w !== win);
});
}
内存基准
| 进程 | 空闲目标 | 警告 | 严重 |
|---|---|---|---|
| 主进程 | < 50MB | 100MB | 200MB |
| 渲染器(简单) | < 100MB | 200MB | 400MB |
| 渲染器(复杂) | < 200MB | 400MB | 800MB |
DevTools集成
Chrome DevTools内存面板
// 启用远程调试
app.commandLine.appendSwitch('remote-debugging-port', '9222');
// 通过chrome://inspect或DevTools内存面板访问
编程式DevTools协议
const { debugger } = webContents;
debugger.attach('1.3');
// 获取堆快照
debugger.sendCommand('HeapProfiler.takeHeapSnapshot');
// 跟踪分配
debugger.sendCommand('HeapProfiler.startTrackingHeapObjects');
最佳实践
- 定期堆快照: 在操作前后获取快照
- 监控RSS增长: 跟踪随时间变化的驻留集大小
- 清理监听器: 组件卸载时始终移除事件监听器
- 弱引用: 对缓存使用WeakMap/WeakSet
- 限制窗口实例: 尽可能池化和重用BrowserWindows
- 在生产模式下分析: 开发模式具有不同的内存特性
相关技能
electron-ipc-security-audit- 检查IPC监听器泄漏electron-builder-config- 优化内存捆绑包startup-time-profiler- 相关性能优化
相关代理
electron-architect- 内存效率架构指导performance-test-engineer- 综合性能测试