在Chrome浏览器中JavaScript冻结/崩溃

4
这是代码片段链接:http://jsfiddle.net/36mdt/。大约10-20秒后,显示器开始随机冻结并很快崩溃。我无法在Firefox中重现此问题。剖析未发现异常。链接http://jsfiddle.net/3pbdQ/显示明显存在内存泄漏。即使在1 FPS的情况下,每个帧的内存使用量也会增加5兆字节。顺便提一句,这个例子真正展示了Math.random()实际上并不那么随机。

3
我还没有答案,但那个视觉效果真的太棒了... :) - chrisfrancis27
4
你有没有注意到,在经过10秒后,它使用了1.2GB的内存。 - Esailija
@Esailija 任务管理器显示有变化,但是分析显示没有变化...? - trumank
@Esailija Chrome控制台中的“Profiles”选项卡。 - trumank
@Esailija 是的,那就是我的意思。 - trumank
显示剩余10条评论
3个回答

3
我只做了两个性能优化,现在它不会在 5 分钟后崩溃(而且似乎也没有泄漏内存)。请查看http://jsfiddle.net/3pbdQ/3/
  1. 不要在每次迭代中计算大小。
  2. 使用超时代替冻结间隔。
  3. 使用按位操作符将数字向下取整。

分析未发现异常。

据我所知,Chrome Profiler 无法与 WebWorkers 一起使用。根据与 Paul Irish 的谈话:

"检查 about:inspect 是否有共享工作进程,还可以在 worker 代码中执行 console.profile()(我认为),并捕获这些内容。'cleans up'是垃圾回收器:如果清理后仍然存在过多内存增长,则表示存在泄漏。"

另外,这个示例确实展示了 Math.random() 确实不那么随机。

众所周知,没有完美的随机算法,但是你看到的一堆分组颜色是因为你没有设置 canvas.height 和 canvas.width,并且它与 CSS 值不同。

编辑:仍然存在内存泄漏,我不知道原因,大约 10 秒钟后它会“清理”。已超出我的知识范围,但以 60 FPS(var TIME = 16)平稳运行。


1
如果你让它闲置半个小时,它仍然存在内存泄漏问题。 - trumank
@MathWizz 是的,我在最后一次编辑中意识到了这一点,但是如何正确地“清理它”,除了垃圾收集器之外,超出了我的知识范围。 - Tom Roggero
1
虽然它并不能完全修复内存泄漏问题,但接受它可以在很大程度上帮助解决这个问题。 - trumank

1

根据您使用的系统和浏览器版本,一些步骤可能会有所不同,尽管我尽力提供与大多数系统兼容的常见步骤。

禁用沙箱: 1. 右键单击 Google Chrome 桌面图标。 2. 选择属性。 3. 点击快捷方式>目标。 4. 添加 "--no-sandbox" 5. 点击 应用|确定。 6. 下载并安装 ZombieSoftFix。 7. 检查并解决检测到的冲突。

禁用插件: 1. 在地址栏中输入"about:plugins"。 2. 按 ENTER 键。 3. 禁用在列表页面中显示的所有插件。

清除临时文件: 1. 点击扳手图标。 2. 选择 更多工具|清除浏览数据。 3. 勾选所有框,点击 "清除浏览数据"按钮确认该过程。

谢谢 & 致意。


0

有趣……不过最近已经修复了:http://code.google.com/p/chromium/issues/detail?id=132769#c7 :D - trumank

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