声明的ActionScript 3 文档flash.utils.setTimeout
:
如果不调用该
clearTimeout()
函数取消setTimeout()
调用,则包含设置超时关闭函数的对象将不会被垃圾回收。
这听起来很荒谬。没有理由它应该持有对它永远不会再次调用的函数/闭包的引用,并且等效的 JavaScript 函数不会泄漏内存。
这是真的?
声明的ActionScript 3 文档flash.utils.setTimeout
:
如果不调用该
clearTimeout()
函数取消setTimeout()
调用,则包含设置超时关闭函数的对象将不会被垃圾回收。
这听起来很荒谬。没有理由它应该持有对它永远不会再次调用的函数/闭包的引用,并且等效的 JavaScript 函数不会泄漏内存。
这是真的?
这不是真的,至少在当前版本的 Flash 中是这样。
我创建了一个函数,它创建一个大字符串,创建一个引用它的闭包,然后setTimeout
用闭包调用。
public function tick():void {
var data:String = "helloworld";
for (var j = 0; j < 20; j++) {
data += data;
}
var f = function() {
var i = 0;
if (data.length > 0) {
i++;
}
};
setTimeout(f, 0);
}
我非常频繁地运行此功能,并使用System.totalMemory
(以及 OS X 活动监视器)来监视 Flash 的内存使用情况。
function Main():void {
setInterval(tick, 10);
setInterval(display, 500);
}
public function display():void {
trace("Memory usage: " + System.totalMemory + "B.");
}
内存使用量会短暂上升,但随后会随着垃圾收集器的加入而回落。平均内存使用量在几分钟内保持稳定。
当我修改代码以保持对每个闭包1的显式引用时,内存使用量在几分钟内上升了许多 GB。文档已过时。Flash 不保留对传递给的闭包的引用setTimeout
。(至少在 OS X 上;我认为在 Windows 上是一样的。)
1我创建了一个 Array 作为静态类 var 并push
在f
调用setTimeout
.