Я столкнулся с проблемой утечки памяти в моем приложении node js. Я не могу опубликовать код здесь, но я хотел бы знать, могут ли эти вещи вызвать утечку памяти. Это может помочь мне узнать, где я могу сделать что-то неправильно:
- Локальная переменная внутри функции:
например.
function Foo(){
var foo = {a: 'b'};
console.log(foo);
}
Теперь, если я вызову эту функцию в POST route, она будет объявлять var foo
каждый раз. Он освобождает память или старый var foo
все еще где-то держит память? Нужно ли явно делать что-то вроде foo = null
в последнем утверждении моей функции? (Обратите внимание, что foo - это объект здесь. Я также хотел бы знать, было ли это целым числом или строкой).
Я хочу сказать следующее:
app.post('/home', function (req, res) {
Foo();
res.end();
});
- Маршрут
Это может быть похоже на 1-е, но все же я хочу знать:
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 или (что-то вроде этого) для предотвращения утечки памяти? -
Глобальная переменная:
var globalVar = 5; app.post('/home', function (req, res) { glbalVar = globalVar + 1; res.write( "Что-то" ); Отправить(); });
Здесь единственное различие между 4 и 2 - это область переменных. Нужно ли мне null изменять эту переменную или переопределять память?
EDIT:
Как и было предложено, я прочитал другой ответ по оригинальному вопросу T.J. Crowder. Это очистило некоторые вещи для меня, но я все еще сомневаюсь в своих пунктах 3 и 4. В 3, req
объект НЕ создан мной, так что мне нужно его сделать null
? В 4 переменная является глобальной. Будет ли оно следовать тому же, что сказано T.J?
Теперь, когда некоторые вещи очищаются, я добавляю здесь еще одну ситуацию, которая заключается в использовании node-apn в моем script и имеет следующий код асинхронного кода:
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? И так как я закончил res
, прежде чем ждать ответа функции async уведомлений, будет ли это закрытие (если оно есть), приведет к утечке памяти, поскольку он будет содержать мой объект data
?