信任Javascript垃圾收集器
Trusting Javascript garbage collector
我有几个例子,我的Javascript代码似乎在泄漏内存,但我不确定垃圾收集器应该得到什么。
例如,Firefox中运行的间隔计时器函数中的var = new Object()
似乎会随着时间的推移而泄漏。有一些简单的解决方案,但我很好奇我是否应该期望垃圾收集器处理所有事情,或者我负责帮助垃圾收集器。
如果我需要帮助垃圾收集器,规则是什么?
大多数(我相信所有)Javascript(ECMAScript)引擎都通过一种称为"引用计数"的方法工作。
简而言之,当没有任何对象指向它时,它就会被释放。。。
有两件事可能会让你感觉不到有多少内存在被使用。
1) ECMAScript不会在系统处理完对象后立即释放该对象。垃圾回收是"根据需要"运行的。这可能会有很大的不同。
2) 闭包对引用的保留时间可能比你想象的要长。意外的关闭可能会比你预期的时间更长。
不得不将其作为一个答案,而不是长度的注释:
好的——首先对术语进行澄清:
如果它在计时器上运行,那么它是而不是递归的。然而,这是一个常见的误解。
它是递归代码,函数调用自己——原始函数调用保留在堆栈上,直到整个过程最终展开,并将值返回给原始调用方。当使用超时时,函数的每次迭代都在一个单独的执行上下文中。
递归函数示例函数阶乘(n){如果(n==1){返回1;}其他{返回n*阶乘(n-1);}}
这是/不是/递归的:函数烦恼(){window.setTimeout(烦人,1000);window.aalert("这会让每一秒都感到烦恼!");}
"烦恼"的每一次迭代都是完全独立的。它只是为要调用的另一个实例设置计时器。堆栈上没有一堆"烦人"函数,也不能向调用方返回任何内容。
第二:在我给你的例子中,变量a
并没有超出范围,但a
引用的旧对象没有活动引用,所以它们可以自由释放。变量指向的内容可能会有所不同。
var a, b;
a = {};
b = a; // This object now has TWO references using it.
b = null; // The object now has one reference
a = null; // Object has no references and is free for release.
在这一点上,我能做的最好的事情就是把你指向这里:
http://www.ibm.com/developerworks/web/library/wa-sieve/
- 单击时选择2(未选中),显示加载微调器javascript
- 在照片查看器(Javascript和jQuery)中异步加载图像时可能出现错误
- 信任Javascript垃圾收集器
- 如何在 ajax 调用后更改包装器 JavaScript 函数中的全局变量
- 当页面回发ASP.NET时,时间选择器javascript将停止工作
- Chrome扩展:链接收集器
- AngularJS-由$scope创建的作用域何时执行$new()已删除.垃圾收集器或Angular负责处理它吗
- 找不到定位器Javascript
- 是在window.location重定向后调用的垃圾收集器
- 密码验证器javascript正则表达式
- 创建 1337 密码检查器(javascript)
- 在 JavaScript 上添加/删除侦听器(垃圾收集器)
- 修剪器javascript,这样使用它是否正确
- 如何将复选框中的选中值收集为 javascript 数组/字符串
- Undersatnding JavaScript 不可变变量和垃圾收集器
- 有没有办法在基于 webkit 的浏览器中强制使用 Javascript 垃圾收集器
- javascript垃圾收集器处理全局变量吗?
- Javascript -垃圾收集器计时器
- 内部引用对象上的Javascript垃圾收集器
- Javascript中的循环引用/垃圾收集器