首页 > 解决方案 > 为什么这个 http 服务器被描述为泄漏?

问题描述

这个网站在一篇关于内存泄漏的文章中描述了下面的 http 服务器实现。它出什么问题了?

const http = require('http');

var server = http.createServer((req, res) => {
 for (var i=0; i<1000; i++) {
 server.on('request', function leakyfunc() {});
 }

 res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
server.setMaxListeners(0);

console.log('Server running at http://127.0.0.1:1337/. Process PID: ', process.pid);

标签: node.jsmemory-leaks

解决方案


http.createServer返回一个http.Server扩展EventEmitter 的类型的对象。现在,anEventEmitter允许将监听器附加到它,一旦触发相应的监听器就会执行event(在这种情况下,当 http-server 收到请求时)。

在您的情况下,您在每个请求上附加1000 额外的侦听器到 http-server,这将执行leakyfunc()每个请求。因此,您可能需要在每个请求上执行大量侦听器,最终会耗尽您的堆内存。


推荐阅读