JavaScript mousemove空事件处理程序会泄漏内存吗?

3
我正在以下方式中使用事件监听器/处理程序:

我正在以下方式中使用事件监听器/处理程序:

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

    mouseMove = function() {
    }

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

在主文档的onload处理程序中调用“initBuilder”。

即使像上面那样使用空函数,当我在Chrome(23.0.1271.64)或FF(16.0.2)中运行此代码时,每次鼠标移动时都会分配内存,但从未释放。

我知道您始终需要删除事件侦听器以避免内存泄漏,但是当它是mousemove处理程序时,该如何操作?处理程序需要在页面打开期间一直处于活动状态。

我还注意到,以类似方式为mouseup或mousedown添加侦听器/处理程序不会导致任何额外的内存分配。

我是否遗漏了某些基本要素?任何见解将不胜感激。


1
我认为你已经将代码精简得太多了。 :-) 我们需要看一下 mousemove 处理程序的操作,以帮助你理解为什么与调用它相关的内存没有被释放。如果它确实像所示那样为空,与调用相关的内存将立即有资格进行释放,并且 Chrome 在优化这类简单情况方面非常出色。我猜测你的处理程序可能会做一些(无意中)卡住事情的操作。 - T.J. Crowder
1
症状听起来像是每个 mousemove 都在注册一个额外的事件处理程序或其他不会被垃圾回收的变量。 - Paul S.
@T.J.Crowder:就是这个问题,当我有一个空函数时,就像上面处理程序中什么也没有发生一样,我会遇到内存问题。 - user1812575
1
在Chrome上,当您取消选择相应的选项卡时,GC tend开始收集页面。如果内存增长,则可能还没有必要启动GC。 - pimvdb
1
这是一篇关于在Chrome中跟踪内存泄漏的有趣文章。如果你尝试了这个,你的结果如何?https://developers.google.com/chrome-developer-tools/docs/heap-profiling - Owen Allen
显示剩余8条评论
1个回答

0

如果您使用devtools > timeline记录内存使用情况,您会发现在事件触发后内存得到了很好的释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接