js-memory-leak-detector
Version:
A comprehensive memory leak detector for web applications with Redux Toolkit support
216 lines (168 loc) • 5.72 kB
Markdown
for web applications that helps identify and prevent memory leaks in JavaScript/TypeScript applications.
- **Event Listener Tracking** - Detects unremoved event listeners
- **Timer Tracking** - Identifies uncleaned timeouts and intervals
- **DOM Reference Tracking** - Finds detached DOM nodes and excessive DOM growth
- **Memory Growth Analysis** - Monitors heap usage and identifies suspicious growth patterns
- **Real-time Reporting** - Configurable reporting intervals with detailed leak suspects
- **TypeScript Support** - Full TypeScript definitions included
- **Zero Dependencies** - Lightweight with no external dependencies
```bash
npm install js-memory-leak-detector
```
```javascript
import MemoryLeakDetector from 'js-memory-leak-detector';
// Basic usage
const detector = new MemoryLeakDetector({
onReport: (report) => {
console.log('Memory Report:', report);
},
onLeak: (leak) => {
console.warn('Potential leak detected:', leak);
}
});
detector.start();
// Stop when done
detector.stop();
```
```javascript
const detector = new MemoryLeakDetector({
enableEventListenerTracking: true, // Track event listeners
enableTimerTracking: true, // Track timers
enableDOMTracking: true, // Track DOM nodes
enablePerformanceObserver: true, // Use Performance Observer API
reportInterval: 30000, // Report every 30 seconds
memoryThreshold: 300, // Alert when memory > 300MB
onReport: (report) => {
// Handle memory reports
console.log('Heap used:', report.heapUsed);
console.log('Leak suspects:', report.leakSuspects);
console.log('Recommendations:', report.recommendations);
},
onLeak: (suspect) => {
// Handle individual leak detection
if (suspect.severity === 'critical') {
alert('Critical memory leak detected!');
}
}
});
```
```javascript
{
timestamp: 1642123456789,
heapUsed: 52428800, // Bytes
heapTotal: 67108864, // Bytes
external: 1048576, // Bytes
arrayBuffers: 524288, // Bytes
leakSuspects: [
{
type: 'event-listener', // 'timer' | 'dom-reference' | 'detached-dom' | 'closure'
severity: 'high', // 'low' | 'medium' | 'high' | 'critical'
description: '25 event listeners attached to HTMLDivElement',
count: 25,
stackTrace: '...' // Available for some leak types
}
],
recommendations: [
'Remove event listeners when components unmount',
'Clear intervals and timeouts when no longer needed'
]
}
```
```javascript
import { useEffect } from 'react';
import MemoryLeakDetector from 'js-memory-leak-detector';
function App() {
useEffect(() => {
const detector = new MemoryLeakDetector({
onLeak: (leak) => {
if (process.env.NODE_ENV === 'development') {
console.warn('Memory leak detected:', leak);
}
}
});
detector.start();
return () => detector.cleanup();
}, []);
return <div>Your App</div>;
}
```
```javascript
import MemoryLeakDetector from 'js-memory-leak-detector';
export default {
mounted() {
this.detector = new MemoryLeakDetector({
onReport: this.handleMemoryReport
});
this.detector.start();
},
beforeDestroy() {
this.detector.cleanup();
},
methods: {
handleMemoryReport(report) {
// Handle memory reports
}
}
}
```
```javascript
// BAD - Memory leak
document.addEventListener('click', handleClick);
// GOOD - Cleanup
const cleanup = () => document.removeEventListener('click', handleClick);
document.addEventListener('click', handleClick);
// Call cleanup when component unmounts
```
```javascript
// BAD - Memory leak
const interval = setInterval(() => {}, 1000);
// GOOD - Cleanup
const interval = setInterval(() => {}, 1000);
clearInterval(interval); // Clear when component unmounts
```
```javascript
// BAD - Memory leak
let elements = [];
elements.push(document.querySelector('.item')); // Keeps DOM ref
// GOOD - Use WeakMap or clear references
const elementMap = new WeakMap();
```
- `start()` - Start monitoring
- `stop()` - Stop monitoring
- `generateReport()` - Generate immediate report
- `getSnapshots()` - Get memory snapshots history
- `cleanup()` - Clean up and stop monitoring
- `onReport(report)` - Called on each report interval
- `onLeak(suspect)` - Called when leak is detected
- Chrome 60+
- Firefox 55+
- Safari 12+
- Edge 79+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
Copyright (c) 2025 pramuddhika
**GitHub**: [js-memory-leak-detector](https://github.com/pramuddhika/js-memory-leak-detector)
- **Issues**: [Report bugs and request features](https://github.com/pramuddhika/js-memory-leak-detector/issues)
- **Pull Requests**: [Contribute code](https://github.com/pramuddhika/js-memory-leak-detector/pulls)
- **Releases**: [View all releases](https://github.com/pramuddhika/js-memory-leak-detector/releases)
Contributions welcome! Please read our contributing guidelines and submit pull requests.
A comprehensive memory leak detector