Я работаю с прослушивателями/обработчиками событий следующим образом:
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 не приводит к дополнительному выделению памяти.
Я упускаю здесь что-то фундаментальное? Любое понимание будет оценено.
mousemove
, чтобы помочь вам понять, почему память, связанная с его вызовом, не освобождается. Если он действительно пуст, как показано, память, связанная с вызовом, будет немедленно освобождена, и Chrome неплохо справляется с оптимизацией таких простых случаев. Я предполагаю, что ваш обработчик делает что-то, что (непреднамеренно) связывает вещи. - person T.J. Crowder   schedule 09.11.2012--js-flags="--expose-gc"
, а затем вызватьgc()
, но это явно не то, что вы можете заставить пользователя сделать. Тем не менее, если GC решит не запускаться, то, вероятно, в этом просто нет необходимости, и выполнение GC только повредит производительности. GC запустится, если с памятью действительно возникнут проблемы, вы можете ему доверять :) - person pimvdb   schedule 09.11.2012