Идентифицировать утечку памяти закрытия с помощью memwatch- node
Мой проект Node.js страдает утечкой памяти, я уже установил переменные в значение null в закрытии, я имею в виду, что я знаю код следующим образом:
var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
console.log(b);
});
Повреждает утечки памяти, поэтому я добавляю код для установки этих переменных в значение null;
var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
console.log(b);
a = null;
b = null;
c = null;
});
Но у меня все еще есть утечки, поэтому я пытаюсь использовать memwatch-node
, чтобы выяснить, что не так с моим кодом.
И результат показывает, что closure
вызывает утечку, но не указан достаточно для таргетинга.
У меня есть JSON, как этот
{ what: 'Closure',
'+': 12521,
size: '520.52 kb',
'-': 5118,
size_bytes: 533016 },
И мне интересно, могу ли я получить более подробные сведения о том, что происходит утечка.
Я назначил имя для всех закрытий, но все равно не работаю.
Ответы
Ответ 1
Вы не можете уточнить, какое закрытие. memwatch получает дамп кучи v8, а затем берет разницу и сообщает об утечках, если после 5 последовательных событий сбора мусора этот счетчик объектов продолжал расти.
Кроме того, я считаю, что вы смущены тем, что такое закрытие. Страница MDN на закрытии дает хорошее описание. Закрытие - это не переменная, а область действия, которая позволяет функциям сохранять ссылки и продолжать работать, когда они используются в части кода, где эти ссылки переменных не будут доступны.
Если вы передаете функции вокруг ссылки на эту функцию, это закрытие может ссылаться на другие блокировки. Таким образом, возможно, у вас есть одно закрытие, в котором может быть много.
Сделайте это: отключите части своего кода, пока memwatch не перестанет жаловаться. Затем посмотрите на этот код. Если вы все еще запутались, напишите больше деталей в этом вопросе.