浏览器刷新不会进行垃圾回收。

12

我在所有测试的浏览器上发现了这个问题 - IE、Firefox、Chrome和Apple的Safari。

据说,刷新浏览器、返回按钮或前进链接应该会清除浏览器节点、JavaScript变量和对象等。但是 WebGL 不适用于这种情况。当我开发一个需要约 100MB 到 200MB 内存的复杂 WebGL 应用程序时,我首先注意到这一点。在开发过程中,我必须经常进行刷新操作,而我的电脑在5到10次刷新后就会开始变慢和冻结。

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

那么问题出在哪里呢?在小型应用程序中可能不会注意到,但对于像我这样的大型 WebGL 应用程序(orbitingeden.com)来说,这是一个真正的问题,并且我的用户将认为软件比实际更占用资源。下图显示这些刷新操作吞掉了我的所有可用内存,因此垃圾回收没有正常工作,或者 JS 和 DOM 对象没有被释放:

enter image description here
(来源:orbitingeden.com)

有人知道如何强制浏览器真正释放内存的技巧吗?为什么所有的文档都是错误的呢?


2
https://bugs.webkit.org/show_bug.cgi?id=76225 - gman
@gman:如果你回答了这个问题,我会给你信用分。概要:WebGL使用的上下文是按域和选项卡保留的,与特定页面(刷新)无关。因此,分配给WebGL渲染的任何内存在用户导航到基础域或关闭选项卡之前都不会释放垃圾收集。可能的解决方法是在应用程序中添加一个退出按钮,快速重定向到一个新域,然后立即重定向回来。 - Orbiting Eden
这个漏洞很快就会被修复,所以希望不久就不需要使用变通方法了。实际上,在webgl一致性测试中已经有针对此问题的测试(https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/conformance/context/context-creation-and-destruction.html)。 - gman
我的WebGL在页面刷新时表现相同,没有释放内存。(https://softwareengineering.stackexchange.com/questions/389264/do-page-reload-refresh-dont-release-the-memory-and-force-garbage-collecot-to-ru) - Muhammad Faizan Khan
同样的问题,刷新页面仍然不能清除进程使用的内存。我也在使用webGL。 - skiss
1个回答

2

垃圾回收的一个问题是对象在不再使用时并不会立即被清理。垃圾收集器可以自行确定何时进行回收。

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


@OrbitingEden:如果内存在需要时没有被回收,那么很可能是真正的内存泄漏。当内存不足时,垃圾回收器应该会启动。 - Guffa
4
那我猜问题更好的表述是:JavaScript内存泄漏如何在页面刷新和导航时持续存在?这是不可能的,对吧? - Orbiting Eden
2
你有没有找到这个问题的答案?我在webgl和gpu内存方面也遇到了类似的问题。每次刷新都会堆积。 - Hobbes
请参考此链接https://softwareengineering.stackexchange.com/questions/389264/do-page-reload-refresh-dont-release-the-memory-and-force-garbage-collecot-to-ru - Muhammad Faizan Khan
2
@Muhammad Faizan Khan现在对我来说看起来不错。Chrome r73。此外,我注意到打开浏览器开发控制台只会导致内存没有被释放的问题。 - Hobbes
显示剩余2条评论

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