如果没有调用clearTimeout(),flash.utils.setTimeout()是否会泄漏内存?

时间:2013-05-10 19:29:28

标签: actionscript-3 flash

ActionScript 3 documentation for flash.utils.setTimeout声明:

  

如果不调用clearTimeout()函数取消setTimeout()调用,则不会对包含set timeout closure函数的对象进行垃圾回收。

这听起来很荒谬。没有理由它应该保持对它永远不会再调用的函数/闭包的引用,the equivalent JavaScript functions do not leak memory

这是真的吗?

1 个答案:

答案 0 :(得分:5)

事实并非如此,至少在目前的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 的显式引用时,内存使用量在几分钟内就会增加到几千兆字节。文档已过时。 Flash不会保留对传递给setTimeout的闭包的引用。 (至少在OS X上;我认为它在Windows上是相同的。)

1 在调用push之前,我创建了一个数组作为静态类var并f编辑每个setTimeout