在javascript中使用大型数组时,释放浏览器内存的最佳方法是什么?

时间:2010-06-20 14:46:10

标签: javascript arrays

这就是我设置的方式:

  • container.html
  • database1.js(包含名为 database1 的大型数组)
  • database2.js(包含名为 database2 的大型数组)

这是一个数组样本(从6000多行缩短为2行):

var database1=[[
    "2010-01-03 07:45","2010-01-03 11:00","534","A","","","","","Installed washing machine","0","1","1","Indeed","",""],[
    "2010-03-20 15:00","2010-03-20 16:00","571","F","","","","","Installed oven","0","5","1","Indeed","",""],[
    etc,etc,etc...]];

当我将database1.js附加到容器的头部时,windows中用于IE的内存从7,7MB跳到21,9MB。这很好,我现在可以通过名为database1的数组循环(第一行和第一列是在database1 [0] [0])。

问题是我需要不时重新附加数据库文件,这样会增加内存使用量(我以为数据库数据会被覆盖)。

因此,第一次重新添加将IE中的内存使用量推高至30,4MB,但随后每次重新追加时继续增加:30,4MB> 33,9MB> 39,5MB> 42,1MB等。

为了防止这种情况发生,我现在清除数组中的每个项目,然后再重新附加database1文件。

for ( var i=0, il=database1.length; i<il; i++ ){
delete database1[i];
}
//append database1.js to head code here

这确实有帮助。内存使用率不会降至最初的7,7MB,但会从21,9MB减少到14,1MB。下一次重新添加会将内存增加到25,9MB(使用循环清除:18,8MB)。下一次重新附加会将内存增加到29,3MB(使用循环清除:24,5MB)。

我很高兴内存使用量没有快速攀升,但也许可以进一步优化?不幸的是,重新加载HTML页面不是一种选择。

1 个答案:

答案 0 :(得分:6)

Java中的内存管理由垃圾收集器辅助,垃圾收集器是一种语言功能,可以定期释放不再需要的内存。

delete运算符实质上表示不再需要内存区域。当垃圾收集器下次运行时,内存将被释放。

垃圾收集是不可预测的 - delete $var$var = null将允许垃圾收集器最终解除内存 。这可能不是即时的。这就是为什么内存使用率没有达到预期的那么快的原因,这就是delete $var没有像你期望的那样快地减少内存使用的原因。

IE确实提供了一种强制垃圾收集器运行的方法:

if (typeof(CollectGarbage) == "function") {
    CollectGarbage();
}

在发生这种情况时,您的脚本可能会变慢,特别是在有大量内存要解除分配的情况下。

最好避免强制垃圾收集 - 让垃圾收集器在它确定最合适的点运行。 CollectGarbage()也没有记录 - 行为可能会改变,或者可能随时删除该功能。

简而言之:

  • 您使用delete database1[i]是您能做的最好的事情
  • 这将最终解除内存
  • 内存使用量将返回最终
  • 的预期级别
  • 你可以在IE中强制进行垃圾收集,但这个过程最终会自行发生