【问题标题】:ie memory release即内存释放
【发布时间】:2012-06-25 08:42:42
【问题描述】:

这是在 IE8 中测试的代码:

var stack = [];
function test() {
    var i = 0;
    while(i++ < 100000) {
        stack[i] = {a: "some string"};
        delete stack[i];
    };
}
test();

这个脚本在 IE 中只占用一点内存。 Windows任务管理器显示29704K,但是下一个:

var stack = [];
function test() {
    var i = 0;
    while(i++ < 100000) {
        stack[i] = {a: "some string"};
    };
    i = 0;
    while(i++ < 100000) {
        delete stack[i];
    }
}
test();

它使用 54860K 内存。我徘徊为什么或如何以其他方式释放内存。

感谢您的帮助。

【问题讨论】:

  • 您如何测量内存使用情况?您的意思是在调用test() 之后,可用的可用内存减少了您显示的数字 - 内存泄漏?还是在函数运行时使用了该内存,但之后又再次可用?请注意,delete 将删除该属性,但这并不意味着该属性用于引用的对象将立即被垃圾回收。
  • 这两个示例在两个页面中运行,该页面中没有其他内容。他们运行几分钟后我得到了记忆。

标签: javascript internet-explorer memory


【解决方案1】:

如果您只是查看系统级别的浏览器总内存使用量,那么您可能查看的是最大浏览器内存使用量,而不是实际使用的内存量。仅仅因为您在浏览器中释放了一些东西并不意味着浏览器将该内存返回给操作系统。该内存可能可供将来在浏览器中重复使用,但尚未返回给操作系统。

您的第二个示例将比第一个示例具有更高的峰值内存使用量,因为您在删除元素之前完全填充了数组。因此,如果由于更高的峰值使用率而在系统级别显示出更大的内存使用量,这也就不足为奇了。这并不意味着更多的内存仍在使用中,只是浏览器必须从系统请求更多的内存来处理更高的峰值使用率,并且浏览器不一定会将现在未使用的内存返回给操作系统。该内存将位于浏览器的可用内存池中,可用于将来的内存请求,因此不会发生内存泄漏。

【讨论】:

  • 感谢您的帮助。等了半天,浏览器处理完数组并没有释放内存给操作系统。
  • @user1476272 - 这并不奇怪。浏览器可能会保留内存以供将来使用。再次运行相同的函数,内存应该不会增加或增加太多,因为其中一些内存正在被重用。
  • 是的,我调用 test() 太多次了,最大内存是 89M。你说的对。但它不会将内存释放到操作系统,这是一个问题。再次感谢。
  • @user1476272 - 如果 IE 没有归还内存,那么这就是它的设计方式 - 我们在这里无能为力。为什么你认为这是一个严重的问题? Windows 具有虚拟内存,因此即使它不再使用并且您的其余应用程序用尽了其余的物理内存,这些未使用的内存也会从物理内存换出到磁盘,并且不会再产生影响。此外,在 2-3GB 系统内存的情况下,89M 并不是什么大问题(3-4%)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多