【发布时间】:2012-12-03 05:20:25
【问题描述】:
我有一个 GreaseMonkey 脚本,该脚本在一个使用框架作为其界面的组成部分的网站上运行。该脚本像筛子一样泄漏内存,我相信这是由于我在其中一个帧中使用了 addEventListener 造成的。很简单,我附加了各种事件侦听器,然后重新加载框架并附加事件侦听器,然后重新加载框架,当您与该框架或其他框架中的各种元素交互时,围绕数百甚至可能数千次迭代。到最后,Firefox 的内存从约 300M 增加到了 2G(或在到达之前崩溃)。
我在某处读到,重新加载整个页面将允许 FireFox 的垃圾收集例程启动并从孤立的事件处理程序中恢复所有内存,并且当我在脚本运行一段时间后按 F5 时确定,大约 10秒内存回落到300M。不幸的是,这破坏了网站中的另一个框架(一个非常受欢迎的聊天窗口),所以虽然它似乎证实了我对 addEventListener 的怀疑,但这并不是一个真正的解决方案。
我还有什么办法可以在不强制刷新整页的情况下正确释放内存吗?
(目前使用的是 GM 1.5 和 FF 17,但从 GM 0.8/FF 4 左右开始就存在问题。)
【问题讨论】:
-
而不是从框架内添加事件侦听器(每次重新加载框架时),只需在框架外的代码中添加一次侦听器。在框架内定义与您要处理的每个事件对应的函数,并让每个事件处理程序(框架外)调用框架内的相应函数。
-
@Lee,您愿意勾勒出该代码的外观吗?另外,我将如何处理偶尔来来去去的元素?从本质上讲,该窗格是一个状态窗格,当您的状态发生变化时,会出现新元素,然后我会将一些事件附加到这些元素上。 (也有永久元素,我非常期待尝试你的方法。:-))
-
Lee 的方法如果是跨域就行不通。 ...尚不清楚
addEventListener是一个/问题,但如果您对jQuery 持开放态度,则可能有一个jQuery 解决方法。如果您在禁用 Greasemonkey 脚本的情况下使用该网站至少 30 分钟会发生什么? -
@Brock,所有活动都在一个域内。我绝对对 jQuery 持开放态度。当我在没有启用 GM 的情况下使用该站点时,根本没有泄漏。
-
另外,我完全愿意接受您可以推荐的任何其他故障排除技术,以缩小问题的根源。 :-)
标签: javascript memory greasemonkey addeventlistener