查看文章
 
ActionScript 3.0垃圾回收
2008-07-03 14:36

作者:flashxm     来源:闪无忧

说明:里面的主要代码是原作者的,自己改动小小~,发现测试的与原作者的有点不符

众所周知,在as3的flash运行器中新增了垃圾回收的机制,即自动从内存中清除一些不可访问的对象。这个过程我们是无法控制的,不过可以通过一个例子来观察这个过程:

  1. package
  2. {
  3. import flash.display.Sprite;
  4. import flash.text.TextField;
  5. import flash.utils.Timer;
  6. import flash.events.Event;
  7. import flash.events.TimerEvent;
  8. import flash.system.System;
  9. public class GarbageCollection extends Sprite
  10. {
  11. public function GarbageCollection()
  12. {
  13. var s:Sprite = new Sprite;
  14. s.graphics.beginFill(0, 1);
  15. s.graphics.drawRect(0, 0, 100, 100);
  16. //addChild(s);
  17. s.addEventListener(Event.ENTER_FRAME, enterframelistener);
  18. var timer:Timer = new Timer(1);
  19. timer.addEventListener(TimerEvent.TIMER, timelistener);
  20. timer.start();
  21. }
  22. private function timelistener(e:TimerEvent):void
  23. {
  24. new TextField();
  25. }
  26. private function enterframelistener(e:Event):void
  27. {
  28. trace('Flash Player当前所用内存(字节):', System.totalMemory);
  29. }
  30. }
  31. }

当输出窗口停止输出信息时就意味着在构造方法中创建的局部变量s被当成垃圾给回收了。

如果将addChild(s)取消注释,s就会被放到场景中,从而不被回收。系统转而回收timelistener里创建的n多没用的new TextField,可以看到:
…省略…
Flash Player当前所用内存: 3403776 字节
Flash Player当前所用内存: 3407872 字节
Flash Player当前所用内存: 3420160 字节
Flash Player当前所用内存: 2142208 字节
Flash Player当前所用内存: 2146304 字节
…省略…
很明显可以看到垃圾回收的过程。

ps: 此例原型是Essential ActionScript 3.0 P277的Example 14-1. Garbage collection demonstration

这个是我转贴过来的,主要是用于大家交流。

经过测试,发现并不是完全按这个机制去回收的,我发现注释不注释掉addChild(s),都不会停止输出信息,说明s是没有被回收的。

Flash Player当前所用内存(字节): 6676480

。。。。。。。

Flash Player当前所用内存(字节): 8167424

。。。。。。。
Flash Player当前所用内存(字节): 6676480

虽然s没有被回收,内存存储的量也会发生上面的一个变化过程,说明一些无用的new TextField还是被回收了,就这样内存循环变化着数据。

不知道是我的理解有误,还是测试有问题?我的观点也不一定正确。希望高人可以指点


类别:flash技术2.0||添加到搜藏 |分享到i贴吧|浏览(304)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu