Javascript mousemove пустой обработчик событий с утечкой памяти?

Я работаю с прослушивателями/обработчиками событий следующим образом:

    var _builder_canvas = document.getElementById("Builder");

    mouseMove = function() {
    }

    initBuilder = function( ) {
         // Add mouse listener events
         _builder_canvas.addEventListener( 'mousemove', mouseMove, true);
    }

При вызове initBuilder с обработчиком загрузки основного документа.

Даже с пустой функцией, как указано выше, когда я запускаю этот код в Chrome (23.0.1271.64) или FF (16.0.2), при каждом движении мыши выделяется память, которая никогда не освобождается.

Я знаю, что вам всегда нужно удалять прослушиватели событий, чтобы избежать утечек памяти, но как это сделать, если это обработчик mousemove? Обработчик должен быть активен все время, пока страница открыта.

Я также заметил, что добавление прослушивателя/обработчика аналогичным образом для mouseup или mousedown не приводит к дополнительному выделению памяти.

Я упускаю здесь что-то фундаментальное? Любое понимание будет оценено.


person user1812575    schedule 09.11.2012    source источник
comment
Я думаю, вы слишком урезали свой код. :-) Нам нужно посмотреть, что делает обработчик mousemove, чтобы помочь вам понять, почему память, связанная с его вызовом, не освобождается. Если он действительно пуст, как показано, память, связанная с вызовом, будет немедленно освобождена, и Chrome неплохо справляется с оптимизацией таких простых случаев. Я предполагаю, что ваш обработчик делает что-то, что (непреднамеренно) связывает вещи.   -  person T.J. Crowder    schedule 09.11.2012
comment
Симптомы звучат так, как будто каждое mousemove регистрирует дополнительный обработчик событий или какую-то другую переменную, которая не будет GCd.   -  person Paul S.    schedule 09.11.2012
comment
@T.J.Crowder: В том-то и дело, что у меня возникают проблемы с памятью, когда у меня есть пустая функция, как и выше, когда в обработчике ничего не происходит.   -  person user1812575    schedule 09.11.2012
comment
@ПолС. : Это то, чего я не понимаю, приведенный выше код - это объем всего, что я делаю. Дополнительный обработчик не регистрируется (если только браузер не делает что-то самостоятельно), и в моем обработчике нет переменных...   -  person user1812575    schedule 09.11.2012
comment
Возможно, память вообще не утекает, а только кажется, что утекает. Chrome будет собирать мусор, когда хром хочет собирать мусор. Он не выбрасывает материал сразу же, как только он выходит за рамки, он выбрасывает его, когда считает, что это наиболее эффективно. Как вы измеряете эту утечку памяти?   -  person Nucleon    schedule 09.11.2012
comment
@Nucleon: Хороший вопрос. Я не измеряю его никаким другим способом, кроме как наблюдательным. Возможно, это так. Но если я сижу и двигаю мышью по холсту, использование памяти будет постоянно увеличиваться на несколько тысяч или более и никогда не уменьшаться. Как вы думаете, это просто неточное отражение использования памяти (Диспетчер задач)?   -  person user1812575    schedule 09.11.2012
comment
@user1812575: user1812575: В среде со сборкой мусора нормально видеть, что память освобождается намного позже, чем когда вы знаете, что она больше не используется. Я немного удивлен, что вы видите это с Chrome, потому что он так хорош в выполнении агрессивных вещей на основе стека, если вы не создаете замыкания, но, эй, радость системы GC в том, что 99,9% вы этого не делаете. нужно беспокоиться о том, как это работает. (Однако последние 0,1% — это сука.)   -  person T.J. Crowder    schedule 09.11.2012
comment
В Chrome GC имеет тенденцию начинать сбор на странице, когда вы отменяете выбор соответствующей вкладки. Если память растет, то, вероятно, пока нет необходимости запускать сборщик мусора.   -  person pimvdb    schedule 09.11.2012
comment
Вот интересная статья об отслеживании утечек памяти в Chrome. Если вы попробуете это, каковы ваши результаты? developers.google.com/chrome-developer-tools/docs/   -  person Nucleon    schedule 09.11.2012
comment
@pimvdb: Спасибо. Я вижу, что если я переключаю вкладки, сборщик мусора запускается. Простите мое невежество по поводу GC, но есть ли какой-то другой триггер, который сработает, если пользователь взаимодействует с моей страницей в течение длительного периода времени, или использование будет продолжать расти, пока вкладка не будет отменена?   -  person user1812575    schedule 09.11.2012
comment
@ user1812575: Единственный способ — запустить Chrome с флагом --js-flags="--expose-gc", а затем вызвать gc(), но это явно не то, что вы можете заставить пользователя сделать. Тем не менее, если GC решит не запускаться, то, вероятно, в этом просто нет необходимости, и выполнение GC только повредит производительности. GC запустится, если с памятью действительно возникнут проблемы, вы можете ему доверять :)   -  person pimvdb    schedule 09.11.2012
comment
@pimvdb: Спасибо, мне стало лучше :)   -  person user1812575    schedule 09.11.2012
comment
@Nucleon: Спасибо, что указали на это. Я на самом деле не использовал эти инструменты профилирования раньше, очень полезно. Я не вижу ничего слишком необычного, за исключением того, что сохраняемый размер mouseMove намного больше, чем аналогичные пустые функции, установленные в качестве обработчиков для mouseup и mousedown. Я надеюсь, что это что-то вроде того, что говорил pimvdb, и GC просто не запускается по какой-то причине. Хотя мне это все равно кажется странным!   -  person user1812575    schedule 09.11.2012


Ответы (1)


Если вы запишете использование памяти с помощью devtools > timeline, вы увидите, что память хорошо освобождается после запуска события.

person Gaël    schedule 09.11.2012