面试题答案
一键面试- 及时释放不再使用的变量
- 在函数内部,当局部变量不再使用时,JavaScript 的垃圾回收机制会自动回收其占用的内存。但要注意避免意外地保持对不再需要对象的引用。例如:
function processConnection(connection) { let data = connection.readSomeData(); // 处理数据 let result = processData(data); // 此时 data 变量不再需要,JavaScript 垃圾回收机制会在合适的时候回收其内存 return result; }
- 事件监听器管理
- 在处理连接时,经常会添加事件监听器。确保在连接结束或不再需要监听时,正确移除监听器,防止因残留的监听器导致对相关对象的引用,进而引发内存泄漏。例如:
const net = require('net'); const server = net.createServer((socket) => { function onData(data) { // 处理数据 } socket.on('data', onData); socket.on('end', () => { socket.removeListener('data', onData); }); });
- 使用 Stream 处理数据
- 对于大量数据的处理,使用 Node.js 的 Stream 模块。Stream 可以逐块处理数据,而不是一次性将所有数据读入内存。例如:
const net = require('net'); const server = net.createServer((socket) => { const outputStream = getOutputStream(); socket.pipe(outputStream); });
- 优化对象创建
- 避免在循环或频繁调用的函数中创建不必要的对象。如果需要重复使用相同结构的对象,可以复用已有的对象实例,而不是每次都创建新的。例如:
// 避免在循环中创建新对象 function handleConnections() { const connectionArray = []; for (let i = 0; i < 1000; i++) { // 每次都创建新对象不是最优 let connection = { id: i }; connectionArray.push(connection); } // 优化方式:复用对象 let connectionTemplate = { id: null }; for (let i = 0; i < 1000; i++) { let connection = Object.assign({}, connectionTemplate); connection.id = i; connectionArray.push(connection); } }
- 内存分析工具
- 使用 Node.js 提供的内置工具,如
node --inspect
结合 Chrome DevTools 的 Performance 和 Memory 面板,或者使用heapdump
等第三方模块,来分析内存使用情况,定位内存泄漏点。例如,使用heapdump
模块:
const heapdump = require('heapdump'); // 在内存占用异常时,生成堆快照 setTimeout(() => { heapdump.writeSnapshot('snapshot.heapsnapshot'); }, 60000);
- 使用 Node.js 提供的内置工具,如