`
hjy2099
  • 浏览: 262748 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Flex垃圾回收机制强制执行

    博客分类:
  • Flex
阅读更多


概述:AVM2理论上是自带垃圾回收机的,但是具体何时进行垃圾回收,理论上非人为所能控制,而我们若要强制启用垃圾回收机,则需要用一些非正规手段,比如如下会提到的手段。关键字:垃圾回收

核心hack技术
批注:所谓强制执行垃圾回收机,是指通过故意使swf在运行时出错,然后throw出错误,而同时通过catch error来继续运行swf文件。而垃圾回收机则会在swf抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。
我当初也是这么理解的,不过从“费gg”处所学到的,包括自己所测试的,并不是所有的error throw都能触发垃圾回收机,而也只局限于某些特定的error,而上文的例子中的这一error恰为其中的一种error类型。
try{
        new LocalConnection().connect("MoonSpirit");
        new LocalConnection().connect("MoonSpirit");
}catch(error : Error){}运行上述代码,可强制执行一次垃圾回收机。具体测试:
分别用initNoBitmapDataView()和initBitmapDataView()进行10k个举行元素创建
测试结果:
1.1不使用BitmapData 内存占用 40M
2.1使用BitmapData 依旧内存占用 40M!
原因分析: 虽然_sqrList被设为null,但是原先被_sqrList所引用的1w个sprite数据依旧在内存中存在,虽然AMV2自带垃圾回收机,但是何时进行垃圾回收是不确定的。而要强制执行垃圾回收机,则要用上文提到的hack手段
2.2使用BitmapData + 垃圾回收hack 内存占用 12M
package {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.net.LocalConnection;        public class MoonSpirit extends Sprite {
                private const SQR_AMOUNT  : int = 10000;   //方块数量
                private var _container_sp : Sprite;        //容器sprite
                private var _sqrList      : Array;         //所有方块的引用

                public function MoonSpirit() {
                        init( );
                }

                private function init( ) : void{
                        _container_sp = new Sprite( );
                        addChild(_container_sp);
                        //initNoBitmapDataView( );
                        initBitmapDataView( );
                }

                //初始化 通过通常手段 显示
                private function initNoBitmapDataView( ) : void {
                        layoutTenThousandSqr( );
                }

                //初始化 通过BitmapData快照 显示
                private function initBitmapDataView( ) : void {
                        layoutTenThousandSqr( );
                        var myBitmapDataObject : BitmapData = new BitmapData(150, 150, false, 0xFF0000);
                        var myImage:Bitmap = new Bitmap(myBitmapDataObject);
                        addChild(myImage);
                        unLayoutTenThousandSqr( );
                        _sqrList = null;
                        doClearance( );
                }

                private function layoutTenThousandSqr( ) : void {
                        _sqrList = new Array( );
                        for(var i : int = 0; i < SQR_AMOUNT; i++){
                                _sqrList.push(new Sprite());
                                _sqrList[i].graphics.beginFill(0xff0000);
                                _sqrList[i].graphics.drawRect(0,0,100,100);
                                _sqrList[i].graphics.endFill();
                                _container_sp.addChild(_sqrList[i]);
                        }
                }

                //不显示
                private function unLayoutTenThousandSqr( ) : void {
                        for(var i : int = 0; i < SQR_AMOUNT; i++){
                                _container_sp.removeChild(_sqrList[i]);
                                delete _sqrList[i];
                        }
                }

                //精髓,垃圾回收机强制调用
                private function doClearance( ) : void {
                        trace("clear");
                        try{
                                new LocalConnection().connect("foo");
                                new LocalConnection().connect("foo");
                        }catch(error : Error){
                        }
                }
        }
}
本文来源于 冰山上的播客 http://xinsync.xju.edu.cn , 原文地址:http://xinsync.xju.edu.cn/index.php/archives/177

分享到:
评论
1 楼 anreddy 2009-08-24  
//精髓,垃圾回收机强制调用
                private function doClearance( ) : void {
                        trace("clear");
                        try{
                                new LocalConnection().connect("foo");
                                new LocalConnection().connect("foo");
                        }catch(error : Error){
                        }
                }


---
当中的foo是代表什么?在哪定义的?

相关推荐

    Flex垃圾回收机制

    Flex垃圾回收机制是ActionScript 3.0中的一个重要概念,主要应用于Adobe Flex应用程序的内存管理。在Flex开发中,理解并掌握垃圾回收的工作原理对于优化应用程序性能和避免内存泄漏至关重要。 1. **垃圾回收的基本...

    Flex垃圾回收机制详解

    Adobe官方的Flex垃圾回收机制说明,理解了这个文档,将真正理解ActionScript的垃圾回收机制,编写高性能的Flex程序

    flex垃圾回收机制是什么原理

    这很好理解,每个 Flex 应用总有一个 Application 的入口被称为根节点(Root),垃圾收集器从根节点开始遍历每个对象,对可达对象标记为“有效”(有一种例外就是弱引用,后面的章节详谈)。而在这棵树之外的孤岛...

    Flex之垃圾回收

    一个跟踪过程,它传递性地跟踪指向当前使用的对象的所有指针,以便找到可以引用的所有对象,然后重新使用在此跟踪过程中未找到的任何堆内存...公共语言运行库垃圾回收器还压缩使用中的内存,以缩小堆所需要的工作空间。

    flex itemRenderer 渲染机制的概念和使用

    Flex中的itemRenderer是一种关键的组件渲染机制,它允许开发者自定义列表或数据集项的显示方式。在Flex应用中,特别是在处理数据集如ArrayCollection时,我们常常需要以不同的方式展示每个项目,例如图片、文本或者...

    FLEX强制类型转换

    ### FLEX强制类型转换 在Flex开发中,类型转换是一个非常重要的概念,它涉及到如何将一个类型的对象转换为另一个类型的对象。特别是在ActionScript 3(AS3)中,强制类型转换是实现某些功能的关键手段之一。本文将...

    flex 面试题flex

    【Flex面试题】Flex面试题主要涵盖Flex的基础概念、开发框架、MVC模式的应用、内存管理、垃圾回收机制、前端性能优化以及与后端通信等多个方面。以下是对这些知识点的详细解析: 1. AS2与AS3的区别: AS2...

    Flex的事件机制笔记

    Flex事件机制是Adobe Flex应用程序开发中的核心组成部分,它允许组件之间进行有效的通信和交互。对于初级Flex程序员或爱好者来说,理解这一机制至关重要。在本文中,我们将深入探讨Flex事件的各个方面,包括事件流、...

    flex安全机制详解

    Flex的安全机制之一就是沙箱机制,它限制了SWF文件能够访问的资源范围,以防止恶意代码的执行。沙箱机制将不同的SWF文件隔离在各自的“沙箱”内,这样即使其中一个SWF文件被攻击者利用,也不会影响到其他SWF文件。 ...

    Flex4.5事件机制

    Flex4.5事件机制是Flex应用程序开发中的核心组成部分,它基于ActionScript 3.0的事件模型,并且遵循DOM3级事件规范。事件机制使得开发者能够轻松响应用户交互和系统事件,为Flex程序员提供了强大且直观的处理工具。 ...

    Flex 工作中的垃圾

    理解并管理Flex中的垃圾收集机制对于优化应用性能至关重要。 在Flex中,垃圾收集是自动进行的,由ActionScript虚拟机(AVM)负责。它的主要目标是回收那些不再有引用指向的对象所占用的内存。当一个对象没有任何...

    Flex 应用内存泄露的分析与诊断

    总之,理解 FlashPlayer 的垃圾回收机制和 Flex 中对象引用的管理是防止内存泄露的关键。通过谨慎处理对象引用、正确管理事件监听器和利用调试工具,可以有效地减少 Flex 应用中的内存泄露问题,从而提高应用的性能...

    Flex 编程注意之性能优化、垃圾回收的一些总结

    这时,可以采用非标准的强制垃圾回收策略,即通过故意引发错误并捕获它来触发垃圾回收: ```actionscript package util { import flash.net.LocalConnection; import flash.system.System; public class ...

    Flex事件机制详细说明

    ### Flex事件机制详解 #### 一、事件简介 在Flex框架中,事件是应用程序与用户交互的核心机制之一。它可以由多种触发源启动,包括但不限于用户的输入(如键盘按键、鼠标点击)、外部数据加载完成(例如WebService...

    flex事件机制的demo

    Flex ActionScript3.0事件机制的Demo, 举例说明了事件的三个阶段,事件的派发,事件的侦听,事件的拦截,自定义事件等相关知识点. 以上知识点在Demo中都有体现,初学者请仔细分析代码,加强理解,多调试、修改、验证以加深...

    flex事件机制分析

    处理完成后,事件对象会被垃圾回收,以释放内存资源。 7. 事件处理的最佳实践 - 尽量使用事件监听器接口(`IEventListener`)而不是直接将处理函数作为监听器,这样可以避免内存泄漏。 - 在不再需要监听事件时,...

    Flex事件机制(通俗易懂)

    ### Flex事件机制详解 #### 一、引言 Flex是一个强大的框架,用于构建高性能的Web应用程序。对于初学者而言,理解和掌握Flex中的事件机制是非常重要的一步。本文将深入探讨Flex事件机制的基础概念、事件注册通道、...

Global site tag (gtag.js) - Google Analytics