【问题标题】:browser refresh does not do garbage collection浏览器刷新不做垃圾回收
【发布时间】:2012-07-02 10:35:08
【问题描述】:

我在所有经过测试的浏览器上都发现了这一点——Windows 上的 IE、Firefox、Chrome 和 Safari 以及 Apple 上的 Safari。

据称,浏览器刷新、后退按钮或转发链接应该转储浏览器节点和 javascript 变量和对象等。这似乎不适用于 WebGL。我在开发需要大约 100MB 到 200MB 内存的复杂 WebGL 应用程序时首先注意到它。在开发过程中,我必须进行大量刷新,并且我的计算机会在 5-10 次刷新后开始变慢并死机。

经过一些研究,我意识到这不应该。内存泄漏的公认解决方案是刷新应该释放所有 javascript 对象和变量以及 dom 节点的页面。但请看以下图片:

那么这里的交易是什么?在小型应用程序上没有注意到,但对于像我这样的大型 WebGL 应用程序 (orbitingeden.com),这是一个真正的问题,我的用户会认为该软件比实际情况更消耗资源。下图显示这些刷新吞噬了我所有的可用内存,因此垃圾收集不起作用和/或 JS 和 DOM 对象没有被释放:


(来源:orbitingeden.com

有人知道强制浏览器进行真正的内存转储的技巧吗?为什么所有的文档都错了?

【问题讨论】:

  • @gman:如果你回答这个问题,我会给你功劳。概要:WebGL 使用由域和选项卡保留的上下文,与特定页面(刷新)无关。因此,在用户离开基本域或关闭选项卡之前,不会释放分配给 WebGL 渲染的任何内存用于垃圾回收。一种可能的解决方法是向应用程序添加一个退出按钮,该按钮可以快速重定向到一个新的域,然后重新重定向。
  • 该错误将在任何一天得到修复,因此希望很快不需要解决方法。在 webgl 一致性测试中实际上有一个测试 (cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/…)
  • 我的 webgl 在页面刷新时的行为方式相同并没有释放内存。 (softwareengineering.stackexchange.com/questions/389264/…)

标签: javascript dom memory-leaks webgl page-refresh


【解决方案1】:

垃圾回收的要点之一是对象被立即清理,因为它们没有被使用。垃圾收集器可以自行确定何时最方便进行收集。

垃圾回收系统将一些未使用的对象留在堆中是正常的,只要有足够的内存可以使用。计算机不会因为有大量未使用的内存而运行得更快。

【讨论】:

  • 在页面会话期间应该是这样的。但是,经验法则是页面刷新应该执行以下操作:删除所有节点,孤立所有变量,然后强制进行垃圾收集,该垃圾收集应该收集所有最近放弃的对象和变量并将它们从内存中清除。无论如何,根据您的理论,当计算机开始耗尽内存时,垃圾收集应该收集所有未使用的对象并处理它们。但我的电脑却只是停了下来!
  • @OrbitingEden:如果没有在需要时收集内存,那么很可能是实际的内存泄漏。垃圾收集器应该在您运行不足时启动。
  • 那么我想这个问题更好地提出:javascript 内存泄漏如何遍及页面刷新和导航?那是不可能的,对吧?
  • 你找到答案了吗?我对 webgl 和 gpu 内存有类似的问题。每次刷新都会叠加。
  • @Muhammad Faizan Khan 现在对我来说似乎很好。铬 r73。另外,我注意到打开浏览器开发控制台只是在乞求不要释放内存。
猜你喜欢
  • 2017-11-16
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2011-12-21
  • 2012-01-28
相关资源
最近更新 更多