为什么System.total内存不断增加?

时间:2009-06-19 21:39:14

标签: flash actionscript-3 memory actionscript

我有这个空白项目,只是为了检查System.totalMemory变量。据我所知,我得到了这个值:

3076
3092
3096
3088
3092
3096
3100
3104
3108
3112
3117
3121
3125
3129
3133
3137
3141
3145
3149
...
And so on

我没有打开Flash,没有互联网浏览器,没有其他闪存实例。

项目为空白,只有一个静态文本和一个动态文本,称为“内存”。一个 *。as 文件,其中包含以下代码:

package{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.system.System;
    import flash.text.TextField;
    public class Test extends Sprite {
        public function Test() {
            this.addEventListener(Event.ENTER_FRAME,Loop);
        }
        public function Loop(e:Event) {
            memory.text = String(System.totalMemory);
        }
    }
}

这些是我的发布设置。

http://i.stack.imgur.com/3k1vq.png http://i.stack.imgur.com/rwM1D.png

我在Debug和Published * .swf中测试了相同的结果。

我对此没有任何线索,所以请帮忙。

5 个答案:

答案 0 :(得分:25)

答案 1 :(得分:1)

您可能需要查看您正在运行的Flash播放器版本。如果您安装了IDE,那么您在播放器的调试版本中运行的可能性很大 - 与普通播放器相比,它几乎不会像往常那样经常释放内存(如果有的话)。

如果您在调试播放器中运行,则可以强制执行gc扫描 - System.gc();

答案 2 :(得分:0)

当文本字段中的文本发生更改时,Flash必须将不同的字符加载到内存中才能显示它们。这可以解释你获得的几百个字节的增长。

单独留下,足迹会变得多大?

更新:考虑过这个问题后,我认为这是为了为Flash创建临时位图图形来渲染文本......尽管你不会想到跟踪...虽然跟踪必须做一些内部的事情......

您是否考虑过在FlexBuilder中运行它?这有一个分析工具,可以告诉你你的记忆在哪里。

答案 3 :(得分:0)

据我所知,在每个循环中,对System.totalMemory的调用返回一个uint,表示Flash当前使用的当前内存量。调用System.totalMemory返回的uint存储在内存中(即RAM,而不是标记为“memory”的textField)。然后更新memory.text引用以指向uint占用的内存空间。旧uint仍在记忆中,但没有提及它。 Uint是32位(4字节)数据,因此您每次都会看到内存占用增加4个字节。一旦垃圾收集器运行,现在derefrenced uints占用的内存空间应该被释放,你应该看到内存丢失。

然而,当我运行你的示例代码时,我什么也没得到。它上下起伏,它并不像你的那样一直向上,但我在OS X上,所以它是一个不同的播放器。

答案 4 :(得分:0)

也许这很明显,但请记住,System.totalMemory会为您提供Flash Player使用的内存量(静态)。如果您打开了其他Flash应用程序,这可能会解释您的内存增加的原因。