2013-11-28 48 views
2
var http = require('http'); 
function createRequest() { 
    var options = {}; 
    var request = http.request(options, function(response) {}); 
    request.end(); 
} 
createRequest(); 

上面是一个小的Node.js片段。 http.request的返回值是http.ClientRequest的一个实例,存储在函数createRequest内的本地变量request中。什么时候垃圾收集器释放'请求'对象?

该片段是一个更大的应用程序的一部分,它可以对createRequest进行多次调用。我很困惑,在Node.js中收集的http.request调用垃圾回收这些实例的时机。

回答

2

在这种特殊情况下request将永远不会被垃圾收集,因为你还没有从response读取任何数据,并响应具有response.req参考request

然而,在这种情况下:

var http = require('http'); 
function createRequest() { 
    var options = {}; 
    var request = http.request(options, function(response) { 
     response.resume() 
    }); 
    request.end(); 
} 
createRequest(); 

request将垃圾收集响应后,最终发出end事件。

+0

“response has'response.req' reference to'request'”,你能指点我的链接吗? –

+2

我不认为这是记录,这里是代码:https://github.com/joyent/node/blob/v0.10.22/lib/http.js#L1684。无论如何,垃圾收集器不关心它是否被记录) – vkurchatkin

+0

我认为对象的请求和响应图将被垃圾回收器从主程序检测为不可访问,因此有资格进行垃圾回收。 –