| name | electron-memory-profiler |
| description | Profile Electron app memory usage, detect leaks, analyze renderer process memory, and optimize memory consumption |
| allowed-tools | Read, Write, Edit, Bash, Glob, Grep |
| tags | ["electron","performance","memory","profiling","optimization"] |
| graph | {"domains":["domain:software-engineering"],"specializations":["specialization:desktop-development"],"skillAreas":["skill-area:desktop-ui-frameworks","skill-area:cross-platform-desktop","skill-area:graphics-rendering"],"roles":["role:desktop-developer","role:fullstack-engineer"],"workflows":["workflow:feature-development","workflow:release-management"]} |
electron-memory-profiler
Profile Electron application memory usage, detect memory leaks, and analyze renderer process memory consumption. This skill provides tools and techniques for identifying memory issues and optimizing memory usage in Electron applications.
Capabilities
- Profile main process and renderer process memory usage
- Detect memory leaks through heap snapshots
- Analyze garbage collection patterns
- Monitor V8 heap statistics
- Track DOM node and event listener counts
- Generate memory usage reports over time
- Identify common memory leak patterns
- Provide optimization recommendations
Input Schema
{
"type": "object",
"properties": {
"projectPath": {
"type": "string",
"description": "Path to the Electron project root"
},
"profilingMode": {
"enum": ["snapshot", "timeline", "leak-detection", "comparison"],
"default": "snapshot"
},
"targetProcess": {
"enum": ["main", "renderer", "all"],
"default": "all"
},
Output Schema
{
"type": "object",
"properties": {
"success": { "type": "boolean" },
"memoryProfile": {
"type": "object",
"properties": {
"mainProcess": {
"type": "object",
"properties": {
"heapUsed": { "type": "number" },
"heapTotal": { "type": "number" },
"external": { "type": "number"
Profiling Techniques
Heap Snapshot Analysis
const v8 = require('v8');
const fs = require('fs');
function takeHeapSnapshot(filename) {
const snapshotPath = `${filename}.heapsnapshot`;
const snapshotStream = v8.writeHeapSnapshot(snapshotPath);
console.log(`Heap snapshot written to: ${snapshotStream}`);
return snapshotStream;
}
Memory Monitoring
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)
};
}
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
})
`);
});
Renderer Memory Analysis
const memoryAnalysis = {
getDOMNodeCount: () => document.getElementsByTagName('*').length,
getEventListenerCount: () => {
return window.__eventListenerCount || 0;
},
getDetachedNodes: () => {
return [];
}
};
Common Memory Leak Patterns
1. Event Listener Leaks
window.addEventListener('resize', handleResize);
const controller = new AbortController();
window.addEventListener('resize', handleResize, { signal: controller.signal });
controller.abort();
2. IPC Channel Leaks
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. Closure Leaks
function createHandler(largeData) {
return () => {
console.log(largeData.someProperty);
};
}
function createHandler(largeData) {
const property = largeData.someProperty;
return () => {
console.log(property);
};
}
4. BrowserWindow Leaks
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);
});
}
Memory Benchmarks
| Process | Idle Target | Warning | Critical |
|---|
| Main Process | < 50MB | 100MB | 200MB |
| Renderer (simple) | < 100MB | 200MB | 400MB |
| Renderer (complex) | < 200MB | 400MB | 800MB |
DevTools Integration
Chrome DevTools Memory Panel
app.commandLine.appendSwitch('remote-debugging-port', '9222');
Programmatic DevTools Protocol
const { debugger } = webContents;
debugger.attach('1.3');
debugger.sendCommand('HeapProfiler.takeHeapSnapshot');
debugger.sendCommand('HeapProfiler.startTrackingHeapObjects');
Best Practices
- Regular heap snapshots: Take snapshots before and after operations
- Monitor RSS growth: Track resident set size over time
- Clean up listeners: Always remove event listeners on component unmount
- Weak references: Use WeakMap/WeakSet for caches
- Limit window instances: Pool and reuse BrowserWindows when possible
- Profile in production mode: Development mode has different memory characteristics
Related Skills
electron-ipc-security-audit - Check for IPC listener leaks
electron-builder-config - Optimize bundle for memory
startup-time-profiler - Related performance optimization
Related Agents
electron-architect - Architecture guidance for memory efficiency
performance-test-engineer - Comprehensive performance testing