来自JS脚本的免费浏览器内存

时间:2011-07-15 10:51:52

标签: javascript memory-management asynchronous garbage-collection navigation

是否可以从JavaScript对象中释放浏览器内存?

我正在设计一个Web应用程序的异步导航过程,其中页面部分通过AJAX请求及其必要的组件(CSS,JS,图像等)加载:我想没有适当的脚本,长时间使用应用程序会加载许多不同的对象,导致残酷的内存增长

我可以想象,从DOM中删除脚本标记只会删除DOM节点,而不是它定义的对象和函数,它们仍会加载到浏览器内存中。 (类似的测试:Should a "script" tag be allowed to remove itself?)。

我还尝试在将变量设置为大字符串然后覆盖它时测试浏览器行为:

<html>
<head>
    <title>JS memory test</title>
    <script type="text/javascript">
    function allocate() {
        window.x = '';
        var s = 'abcdefghijklmnopqrstuvwxyz0123456789-';

        for (var i = 0; i < 1000000; ++i) {
            window.x += 'hello' + i + s;
        }
        alert('allocated');
    }

    function free() {
        window.x = '';
        alert('freed');
    }
    </script>
</head>
<body>
    <input type="button" value="Allocate" onclick="javascript:allocate();" />
    <input type="button" value="Free" onclick="javascript:free();" />
</body>
</html>

Chrome任务管理器中的数据:

page weight when loaded:
    5736 KB
page weight after having set the variable:
    81720 KB
page weight after having the variable reset:
    81740 KB

因为我认为JS垃圾收集器抛弃了旧的变量值,所以它会让我感到震惊,因为它会从新分配的值中被覆盖。
Firefox没有单一任务标签管理,因此没有类似Chrome的类似过程监视器,但全局内存使用情况似乎与Chrome一样。

是否有一些错误的假设?

有人可以提供有关有效编程实践或有用资源的建议吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

您无法直接访问内存管理功能。您可以做的最好的事情是删除对对象的引用,以便它们可用于垃圾收集,这将在浏览器认为合适的情况下不时运行。

某些浏览器不时会出现内存泄漏,有些策略可以减少它们,但通常是针对特定情况(例如臭名昭​​着的IE循环引用泄漏,已修复,即使在IE 6的更新版本中,就我而言知道)。

除非您发现有问题,否则可能不值得担心。然后处理它。