面试题答案
一键面试避免内存泄漏
- 及时释放引用 在Node.js中,确保对不再使用的对象及时释放引用。例如,当使用事件监听器时,在不再需要监听事件后,要移除监听器:
const eventEmitter = new EventEmitter();
const listener = () => console.log('Event fired');
eventEmitter.on('event', listener);
// 不再需要监听时
eventEmitter.off('event', listener);
- 处理闭包 注意闭包对内存的影响。如果闭包引用了大对象且长期存在,可能导致内存泄漏。确保闭包中只引用必要的对象,并且在合适的时候释放这些引用。
- 流处理 对于大文件或大量数据的处理,使用流(Stream)而不是一次性读取整个数据到内存。例如,读取文件时:
const fs = require('fs');
const readableStream = fs.createReadStream('largeFile.txt');
readableStream.on('data', (chunk) => {
// 处理数据块
});
readableStream.on('end', () => {
// 数据读取完毕
});
合理设置缓存
- 缓存策略选择
- LRU(最近最少使用):适用于数据访问具有时间局部性的场景。例如在Web应用中缓存用户最近访问的页面数据。可以使用
lru - cache
库:
- LRU(最近最少使用):适用于数据访问具有时间局部性的场景。例如在Web应用中缓存用户最近访问的页面数据。可以使用
const LRU = require('lru - cache');
const cache = new LRU({
max: 100, // 最大缓存项数
maxAge: 1000 * 60 * 15 // 缓存项过期时间,15分钟
});
cache.set('key', 'value');
const result = cache.get('key');
- **FIFO(先进先出)**:适合于缓存不需要考虑访问频率,只需要保持一定数量的缓存项。可以自己实现一个简单的FIFO缓存队列。
2. 缓存过期处理 为缓存项设置合理的过期时间。如果缓存的数据是经常变化的,设置较短的过期时间,避免使用过期数据。同时,定期清理过期的缓存项,释放内存。 3. 缓存容量控制 根据服务器的内存情况,合理设置缓存的最大容量。避免缓存占用过多内存导致系统内存不足。如果缓存达到最大容量,可以根据选择的缓存策略淘汰旧的缓存项。