Javascript 不同类型的变量作用域是否会导致NodeJ内存泄漏?
我的node js应用程序面临内存泄漏问题。我不能在这里发布代码,但我想知道这些事情是否会导致内存泄漏。这可能会帮助我知道我可能在哪里做错了什么:Javascript 不同类型的变量作用域是否会导致NodeJ内存泄漏?,javascript,node.js,memory,memory-leaks,Javascript,Node.js,Memory,Memory Leaks,我的node js应用程序面临内存泄漏问题。我不能在这里发布代码,但我想知道这些事情是否会导致内存泄漏。这可能会帮助我知道我可能在哪里做错了什么: 函数中的局部变量: e、 g 现在,如果我在POSTroute中调用这个函数,它每次都会声明var foo。它是释放内存还是旧的var foo仍在某个地方保存内存?我是否需要在函数的最后一个语句中显式执行类似于foo=null的操作?(注意,这里foo是一个对象,我还想知道它是整数还是字符串) 我想说的是: app.post('/home', fun
var foo
。它是释放内存还是旧的var foo
仍在某个地方保存内存?我是否需要在函数的最后一个语句中显式执行类似于foo=null
的操作?(注意,这里foo是一个对象,我还想知道它是整数还是字符串)
我想说的是:
app.post('/home', function (req, res) {
Foo();
res.end();
});
app.post('/home', function (req, res) {
var foo2 = 5;
res.write("Something");
res.end();
});
对于每个请求,我是否需要这样做:
app.post('/home', function (req, res) {
var foo2 = 5;
res.write(foo2);
foo2 = null;
res.end();
});
或者它会自动释放它
req
在此未使用。我是否还需要null或(类似这样的)它来防止内存泄漏req
对象不是我创建的,所以我是否需要它使null
?在4中,变量是全局变量。它会跟T.J.说的一样吗
现在,当一些事情被清除后,我在这里添加了另一种情况,即我在脚本中使用的,具有以下异步代码块:
apnProvider.send(note, deviceToken).then( (result) => {
// see documentation for an explanation of result
});
我是这样称呼的:
app.post('/home', function (req, res) {
var data = {foo: req.body.bar};
// above object has all data required to send push notification
sendNotification (data);
res.end();
});
function sendNotification(data){
//other lines of code
//I use data to get note, deviceToken
apnProvider.send(note, deviceToken).then( (result) => {
console.log(result);
});
}
现在我的另一个问题是:这是T.J.所说的闭包的例子吗?由于在等待notification async函数的响应之前,我已经结束了
res
,因此此关闭(如果是)是否会导致内存泄漏,因为它会保存我的数据
对象?您能否准确指出导致内存泄漏的原因-例如堆快照或分配配置文件/时间线?一个变量不是原因。我现在要结束它;如果你还需要什么,请和/或打电话给我。@Bergi我将首先尝试另一个答案,看看它是否能澄清我的疑问。如果需要,我会编辑它,并在这里通知您。Re#3:谁创建了req
引用的对象并不重要。重要的是:对它的任何引用都存在吗?如果是,则对象未被清理(某些对象仍在使用它)。如果不是,那就是。无论您是否将req
设置为null
,这都无关紧要,因为req
是一个参数,当函数返回时会被清除,除非您在回调中创建一个闭包,该闭包在回调返回后仍然存在。Re#4:只要模块存在,变量globalVar
就会存在(它不是全局的,它是模块全局的)。我不认为节点中的模块会卸载,但我不确定。如果卸载了模块,则分配给模块的内存(包括globalVar
)会被回收。
app.post('/home', function (req, res) {
var data = {foo: req.body.bar};
// above object has all data required to send push notification
sendNotification (data);
res.end();
});
function sendNotification(data){
//other lines of code
//I use data to get note, deviceToken
apnProvider.send(note, deviceToken).then( (result) => {
console.log(result);
});
}