Подтвердить что ты не робот

Идентифицировать утечку памяти закрытия с помощью 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 },

И мне интересно, могу ли я получить более подробные сведения о том, что происходит утечка.

Я назначил имя для всех закрытий, но все равно не работаю.

4b9b3361

Ответ 1

Вы не можете уточнить, какое закрытие. memwatch получает дамп кучи v8, а затем берет разницу и сообщает об утечках, если после 5 последовательных событий сбора мусора этот счетчик объектов продолжал расти.

Кроме того, я считаю, что вы смущены тем, что такое закрытие. Страница MDN на закрытии дает хорошее описание. Закрытие - это не переменная, а область действия, которая позволяет функциям сохранять ссылки и продолжать работать, когда они используются в части кода, где эти ссылки переменных не будут доступны.

Если вы передаете функции вокруг ссылки на эту функцию, это закрытие может ссылаться на другие блокировки. Таким образом, возможно, у вас есть одно закрытие, в котором может быть много.

Сделайте это: отключите части своего кода, пока memwatch не перестанет жаловаться. Затем посмотрите на этот код. Если вы все еще запутались, напишите больше деталей в этом вопросе.