2010-06-20 61 views
7

这是我有事情设置:在javascript中处理大型数组时,什么是释放浏览器内存的最佳方式?

  • container.html
  • database1.js(包含大阵叫数据库1
  • 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页面不是一个选项。

+0

(您的计算器帐户现在应该被修复) – 2010-06-20 20:19:34

回答

6

JavaScript中的内存管理得益于垃圾回收器,这是一种定期释放内存不再需要的语言功能。

delete运算符实质上表示内存区域不再需要。内存将在垃圾回收器下次运行时解除分配。

垃圾收集是不可预测的 - delete $var$var = null将允许垃圾回收器释放内存最终。这可能不是即时的。这就是为什么内存使用量没有像您期望的那样快速攀升,这就是为什么delete $var不像您期望的那样快速减少内存使用量的原因。

IE浏览器存在一个装置,迫使垃圾收集器运行:

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

您的脚本可能会减慢,而这种情况正在发生,特别是如果有大量的内存解除分配。

最好避免强制垃圾收集 - 让垃圾收集器运行在它认为最合适的地方。 CollectGarbage()也没有记录 - 行为可能会改变或功能可能在任何时候被删除。

简而言之:

  • 您的delete database1[i]用途是你可以做
  • 这将释放内存最好的最终
  • 内存使用量将恢复到预期水平最终
  • 你可以在IE中强制垃圾收集,但是这个过程最终会发生在它自己的
+0

两点注意事项:1.由于'typeof'是一个运算符,所以不必在操作数上加上大括号。 2.请记住,您不能'删除'[全局变量](http://perfectionkills.com/understanding-delete/#property_attributes):“当声明的变量和函数变成变量对象的属性时 - 或者是激活对象函数代码)或全局对象(对于全局代码),这些属性都是用DontDelete属性**创建的。“但是我想OP在这种情况下不会与全局变量一起工作(因为内存实际上已被释放)。 – 2010-06-20 17:08:14

+0

从@Ben的回答:“干杯乔恩那个伟大的解释。” – 2010-06-20 20:19:16

+0

我正在使用全局变量,在我的情况下使用delete会释放内存。但也许删除并不实际删除,而是清除项目?我用[code] database1 [i] =“”[/ code]替换了[code] delete database1 [i] [/ code],这给出了相同的结果。 – Ben 2010-06-23 16:33:53

相关问题