我目前正在使用nodejs项目,其中一个控制器看起来跟着
var express = require('express'),
router = express.Router(),
blah = require('blah'),
Foo = require('../models/foo');
/* Get all foos */
router.get('/', function (req, res) {
Foo
.getAll()
.then(function (foo) {
return res.json({
foo: blah(foo)
});
})
.catch(function (err) {
//handle error;
});
});
/*
* Some other functions
*
*/
在路由器端点内使用所需的模块blah和模型Foo。根据这篇文章http://www.ibm.com/developerworks/library/wa-memleak/,我假设它不会被垃圾收集器收集,因为它被它内部的一个闭包引用,可能会造成内存泄漏。
在这种情况下,释放内存的正确方法是什么?
答案 0 :(得分:3)
模块缓存在node.js中,因此它们不应泄漏。它们将被加载一次,然后在请求它们的任何后续时间返回最初加载的模块。因此,require()
不应该产生泄漏。初始加载会占用一些内存,但后续加载不应占用更多内存。如果你调用模块构造函数或其他一些使用内存的模块方法,那么该方法就可以独立存在。
在您的特定代码中,模块blah
和Foo
没有泄漏且不符合垃圾回收的条件,因为它们用于仍处于活动状态且仍可调用的路由处理程序中。它们被加载一次,然后在被调用时可供路由处理程序使用。这不是泄漏。这是理想的行为。
如果这不是您所要求的,那么请澄清您认为可能在上述代码中泄露的内容。