此文为MoonSpirit文章

原文http://www.actionscript3.cn/bbs/thread-234-1-1.html

-----------------------------------------------------------------------------------------
首先,要感谢校友学长"费gg"的帮助,提供了核心的hack技术的方法。

然后鉴于几天前一网友关于画上万个sprite之后内存增大问题,在此一并作一下讨论和解决。
-----------------------------------------------------------------------------------------

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

关键字:垃圾回收

核心hack技术


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){
    
   }   
  }
 }
}

转载于:https://www.cnblogs.com/fxair/archive/2010/05/07/1729762.html

zz[as3 hack技术]垃圾回收机强制执行相关推荐

  1. python得垃圾回收机机制gc

    一.为什么要有垃圾回收 解释器在执行到定义变量得语法时,会申请内存空间来存放变量得值,但是由于内存空间是有限得,所以这就涉及到了内存回收问题了,当一个变量值没有用了(简称垃圾),这种时候就应该回收掉这 ...

  2. java中的垃圾回收机

    任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新的对象使用.对于对象内存的释放就是垃圾回收机 ...

  3. Java 垃圾回收机 GC Roots详解(Garbage Collection Roots)

    背景: 之前面试阿里支付宝,被问到常见的GC Root 是什么? 当时自己支支吾吾,明明自己看过深入理解Java 虚拟机这本书,但是就是回答不上来. 后来自己工作中,遇到内存泄漏问题.我百度,下载了M ...

  4. python 垃圾回收哪时候执行_Python 中的垃圾回收机制是如何工作的?

    CPython 中垃圾回收的主要思路 1.维护引用计数器 .对于每一个对象,都有一个对于该对象的引用次数的计数器.如果这个计数器的值减为了 0 ,这就代表这个对象在程序中已经没用了,那么该对象所占用的 ...

  5. java dofinalize_应用与系统稳定性第六篇---JVM垃圾回收之finalize执行时引起timed out 闪退分析...

    一.背景 java.util.concurrent.TimeoutException: android.content.res.AssetManager$AssetInputStream.finali ...

  6. lua的垃圾回收机制

    文章转载自:http://blog.csdn.net/xufeng0991/article/details/44775661 垃圾回收的目的是要释放掉不再被使用变量所占用的内存. Lua的垃圾收集机制 ...

  7. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

  8. Dotnet的垃圾回收

    最近在做一个项目,用到了大量的非托管技术,所以垃圾回收变得很重要.   在说垃圾回收之前,先说说两个概念: 托管代码,是由CLR管理的代码 非托管代码,是由操作系统直接执行的代码 在早期C++的时候, ...

  9. jvm的类加载和运行时数据区和垃圾回收

    类加载过程 加载(loading) 引导类加载器 扩展类加载器 系统类加载器 1.通过一个类的全限定名获取此类的二进制字节流 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 3.在内 ...

最新文章

  1. android fragmentpageradapter切换不更新,关于android:在FragmentPagerAdapter中更新当前片段...
  2. 什么事情是你当了老板才知道的?
  3. libusb usb设备访问接口库
  4. c++ 11 override final
  5. 专属微信二维码python制作_如何利用Python制作简单的公众号二维码关注图
  6. SUSE Labs Con 2018有感
  7. Android-Universal-Image-Loader学习笔记(一)
  8. AGC005_E Sugigma The Showdown
  9. uboot 之环境变量
  10. Canon600D入手记
  11. 初探华尔街期权量化交易的奥秘
  12. 本地计算机添加网络打印机共享,共享好的打印机,如何添加到本地来使用?-win7添加打印机...
  13. html超链接自动下划线,html超链接下划线应该加入吗?
  14. 知乎与百度知道竞品分析-用户五要素
  15. matlab建立模糊规则表,请教matlab怎样建立模糊控制查询表?
  16. 怎样去掉QMainWindow最大化和最小化按钮
  17. select2切换事件如何生效
  18. MATLAB多方法车牌识别系统(bp+模板+GUI)
  19. 华为OD机试真题 C++ 实现【Linux发行版的数量】【2022.11 Q4 新题】
  20. 佛说父母恩难报经原文、译文

热门文章

  1. 降低网站跳出率的技巧分享!
  2. 如何对大量长尾关键词进行优化?
  3. Java中sql_Java中sql都有哪些
  4. java 环境网站404_配置JavaWeb项目环境,修改jdbc配置文件,浏览器报404错误,不修改可以正常部署,jdbc没有改错...
  5. 开发日记-20190801 读书笔记《Linux 系统管理技术手册(第二版)》关键词logrotate 管理日志文件
  6. (转载)Linux新增磁盘、分区、格式化和自动挂载
  7. 最小哈希 minhash
  8. tensorflow实现图像的翻转
  9. Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
  10. Android查询数据库问题