Утечка памяти в JavaScript (Chrome) - PullRequest
8 голосов
/ 03 марта 2011

Я вызываю функцию 50 раз в секунду, которая делает некоторые дорогостоящие вещи, так как много рисует на элементе <canvas>.

Она прекрасно работает, проблем нет, но я просто взялапосмотрите на использование памяти, и она крала 1 МБ в секунду моей оперативной памяти.Похоже, что Chrome собирает мусор каждую минуту или около того, но его использование снова растет.

Я пытался поместить return в определенные места в моей функции, чтобы решить, какая часть моегоФункция точно вызывает утечку.Мне удалось сократить его до определенной строки кода, после которой появляется злая часть, но я не знаю, как ее решить.

Мои вопросы:

  • Какой инструмент доступен для эффективного измерения утечек памяти JavaScript в Chrome?
  • Было бы эффективно установить переменные на null / undefined после их использования, что-то вроде их утилизации?

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

Ответы [ 2 ]

9 голосов
/ 03 марта 2011

Я просто собираюсь вытащить эту цитату напрямую, по ссылке из статьи;

Говоря об утечках памяти, разрыв круговых ссылок - причина утечек - обычно делается с помощью простого нулевого присваивания,Обычно нет необходимости использовать delete.Более того, null'ing позволяет «разыменовывать» переменные - что обычно не может удалить delete.

var el = document.getElementById('foo');
// circular reference is formed
el.onclick = function() { /* ... */ };
// circular reference is broken
el = null;
// can't `delete el` in this case, as `el` has DontDelete

По этим причинам лучше придерживаться нуля, когдаразрыв круговых ссылок.

удалить Объяснено

3 голосов
/ 03 марта 2011

Посмотрите профиль кучи на вкладке «Профили» в инструментах разработчика Chrome для получения информации об использовании памяти.

Чтобы предотвратить утечки памяти, вы можете сделать следующее:

  • Проверьте свой код с помощью JSLint , чтобы увидеть, даст ли это вам несколько указателей.
  • Используйте ключевое слово var, чтобы задать область видимости для ваших переменных, чтобы их можно было собирать, когда они выходят из области видимости.Без ключевых слов var переменные имеют глобальную область видимости.
  • Используйте операторы delete variable; для удаления объекта и ссылки из памяти.Установка переменной в null приведет к удалению только объекта из памяти, но не его ссылки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...