最近在做Flash项目时候发现,Flash CS6 发布的程序在运行超过两个小时后会闪退,在仔细检查脚本代码和资源文件后,排除了这两个方面的原因。又猜测是内存或者GDI泄漏,在任务管理器中观察了一段时间,程序的GDI没有任何变化,但内存有爆发式增长,程序初始运行内存大概是300M左右,20s后增长至1540M左右,然后Flash开始主动回收内存,内存又降至300M左右。依次循环,大概都是在1600M左右Flash会自动回收内存。
这样看起来没有任何问题(设备内存8G,最多的时候才占用60%),但是运行超过两个小时后Flash依旧闪退。没办法清除掉脚本代码,空载测试,也同样会出现闪退问题。然后找了有关Flash内存的文章,如下
Flash强制垃圾回收_weixin_34348805的博客-CSDN博客java和flash的垃圾回收都是一个比较热门的话题,今天我也用一个例子来测试下flash的强制垃圾回收。主要用到的而一个类是LocalConnection。 在Flash player的debug版本中提供了gc的方法 Flash Player初始化运行时,会向操作系统申请一大块内存,如果程序很小,有可能根本用不了这么多内存,但FP在开...https://blog.csdn.net/weixin_34348805/article/details/92812445
Flash Player在内部使用懒惰式引用计数回收方案进行垃圾内存回收。
懒惰式指:FP并不会一次把所有可以回收的对象全部回收,它一次仅会回收一部分,如果内存不够用,它会向操作系统申请,如果系统无内存了,它会再次回收,如果全部回收了仍不够用,Game Over!
引用计数指:FP在内部给每个对象标记一个记号,当没有任何对象引用此对象时,它即是可以被回收的;如果一个容器内有许多相互关联的对象,当把这个容器从显示列表中移除,并且置为null后,它也是可以被回收的。
解决方案
主动回收内存:设置一个6s计时器,去不断回收内存
private var gGCTimer:uint = 0;
//强制回收内存
gGCTimer = setInterval(doGc,6000);
private function doGc():void
{
try
{
var conn1:LocalConnection= new LocalConnection();
conn1.connect("testGc");
var conn2:LocalConnection= new LocalConnection();
conn2.connect("testGc");
}
catch (error:Error)
{
conn1 = null;
conn2 = null;
}
}