是否可以从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一样。
是否有一些错误的假设?
有人可以提供有关有效编程实践或有用资源的建议吗?
非常感谢。
答案 0 :(得分:2)
您无法直接访问内存管理功能。您可以做的最好的事情是删除对对象的引用,以便它们可用于垃圾收集,这将在浏览器认为合适的情况下不时运行。
某些浏览器不时会出现内存泄漏,有些策略可以减少它们,但通常是针对特定情况(例如臭名昭着的IE循环引用泄漏,已修复,即使在IE 6的更新版本中,就我而言知道)。
除非您发现有问题,否则可能不值得担心。然后处理它。