【问题标题】:Interesting observation with IE memory management and javascriptIE 内存管理和 javascript 的有趣观察
【发布时间】:2009-08-26 13:58:23
【问题描述】:

在 Windows 中,当应用程序最小化时,操作系统通过将数据放在页面文件中来释放与应用程序相关的内存。其他垃圾收集也可能执行。

在 Internet Explorer 运行我的 javascript 应用程序的情况下,我发现如果内存使用量从 60mb 开始,那么最小化浏览器会将内存减少到 17mb。最大化然后将其恢复到 40mb

20mb 的增益。

我的应用程序大量使用了 javascript,我怀疑 IE 正在强制收集不再引用的对象。

通过 javascript(仅限 IE),您可以通过以下方式强制垃圾收集:

CollectGarbage()

所以,如果我调用这个方法(不最小化屏幕),我只会回收一个或 2 个 meg。

如果我通过事件队列调用它:

setTimeout(CollectGarbage, 1000)

我回收了大约 3 兆欧

我的应用程序设计为全天运行,因此内存管理非常重要。

有人知道如何强制 IE 清理其内存,达到与手动最小化相同的程度吗?

以编程方式最小化浏览器的建议将被嘲笑!

干杯:)

【问题讨论】:

  • 您的应用是否会使用任何特定的库或框架?

标签: javascript memory explorer


【解决方案1】:

使用delete 关键字取消定义变量/属性,节省内存。 More here.

但如果你只需要丢失对某个对象属性的引用,只需将其设置为null 并等待下一次收集。

小心使用闭包和 lambda 函数,因为它们传统上是内存占用和泄漏源。见Understanding and Solving Internet Explorer Leak Patterns

【讨论】:

  • delete 从原型中删除属性,从而删除引用。obj.prop = null 只是删除引用。因此,在删除的情况下,如果您要遍历 objs 属性,您会发现属性的数量会减少。在 obj.prop = null 的情况下,属性的数量保持不变。从记忆的角度来看,这些方法之间的差异并不显着,但它们在语义上却大不相同。
  • 您在答案中链接的 Mozilla 文档明确表示 delete 与释放内存无关...
  • 嘿 @MikeYoung,感谢 7 年后的对抗性评论。无论如何,我会很好并解释理由。是的,我知道delete 不会自行释放内存。我知道垃圾收集是什么以及它是如何工作的。我什至会说我知道 7 年前是什么。这个垃圾收集是我所追求的。如果您有 obj['foo'] = expensiveObj,则删除 'foo' 会删除引用。假设这是唯一的参考,您已尽最大努力影响在下一次扫描期间释放的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多