11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2726|回复: 5
上一主题 下一主题

[代码优化 & 调试] 分分钟学会【Flash垃圾回收机制】~~~~~~~【死神的烦恼】

[复制链接] TA的其它主题
发表于 2018-11-6 09:51:25 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 TKCB 于 2020-2-4 11:09 编辑

TKCB网站
网址:www.tkcb.cc


【分分钟教程】——系列教程,共3篇




教程开始了
很多高手、大神都曾经讲过“Flash Player垃圾回收机制”,但小弟不才,也想献上一篇“Flash Player垃圾回收机制”的文章,以供观赏。本人系AS3菜鸟一枚,文章有不足之处,敬请包涵理解。

很多新手都不太在意垃圾回收,常常没有将不用的对象删除等等,最终导致程序经常使CPU达到很高。其实大多数时候即使不在意垃圾回收程序也能照常运行,但其实这是对程序的不负责任。这也是阻止你走上更高层级的阶梯。

最近其实我也在思考AS3的未来,我的未来,但想通了一个道理,程序很多地方是想通的,学会了AS3,到了其他语言也是容易的(至少我是这么认为的)。


死神的烦恼
序章,奉天承运,天地诏曰:“神王见你看帖如此认真,特此封你为九幽大帝的死神使徒,你负责收割那些活着犹如死去的人的灵魂,使九幽大帝回归河蟹,使九幽大帝走上全民小康之路!”

第一章,“那些活着犹如死去的人的灵魂????”那到底什么养的人才算符合条件的呢?你百思不得其解,“死神也不好当啊!”你感慨道。

第二章,“故天将降大任于是人也,必先苦其心志……”,想到这里,你还怕什么呢?走起,收割灵魂吧!

第三章,你来到了一个位于某城市中央的高楼,看到了一位满腹肥肠的人坐在华丽的办公室中干着一些见不得人的勾当,你想了想,收了吧。“此人为世人所唾弃,为所有人所厌恶,此可算活着犹如死去。”如此这样,收割了325位这样的灵魂。你是不是感觉很爽,很过瘾!

第四章,你来到了一个医院,看到了一位基本只剩下了脑子还能活动,其他身体部位已经死去的人。你在犹豫是否要收割他的灵魂,但最终你没有下手,因为你看到了他卓越而伟大的思维(物理学、宇宙学、数学),这些都将是人类宝贵的瑰宝,不可剥夺,人们是需要他的。于是你明白了一个道理,那些不被人需要的人可以收割,于是《死神收割法则》第一条便诞生了:不被需要(引用)则为收割(引用计数法)

第五章,收割在继续,你手中的灵魂已经到达了823位,神王对你的成绩表示还算努力,但力度不够、深度不够,还有很多人活着犹如死去。

第六章,你来到一个监牢,看到了一群犯人,他们因为贿赂了官员所以本该死去却仍然活着。他们感情极好,互为需要。他们不符合《死神收割法则》第一条,于是你准备前往下一个地方。但最终你还是收了他们,这些危害社会的人渣即使互为需要也要收割,于是第二条法则诞生了:即使互为需要,但不被这个充满爱的世界需要则收割(标识清除法)

第七章,收割在继续,你手中的灵魂已经到达了9245位,神王对你的成绩表示很满意,但仍然有一类人可以收割你却没有收割,快去收割吧!

第八章,你重返人间,寻找着神王所说的那类人群,终于找到了,对了就是那类似男非女,似女非男的人,于是第三条法则便有了:违反天道轮回则收割(BitmapData.dispose)!

第九章,神界,神王对你的工作给予了32亿个赞,很好,很好,去管理更多的地方吧……

第十章(人间传说),由于死神的存在,人世间充满了正能量,人间一片繁荣气象。

第十章(天界传说),神王正式将这三条收割法则写入《死神法典》,并赐予你了至高无上的死神镰刀作为奖励。

第十章(冥界传说),冥王很不喜欢你,因为自从你的出现冥界的亡魂多了太多,于是和你约在紫禁之巅好好谈谈,自此后,冥王消失了、死神之王(你)也消失了……


程序猿的烦恼
程序猿们也遇到了这个问题,程序出现内存泄露,BUG,已经有851312位程序猿因为修改内存泄露BUG相继疲劳吐血而亡。

所以必须解决这个问题,于是他们想到了死神的传说,办法便有了。

好了,下面便是代码相关的知识。

1. 垃圾回收是什么?为什么要垃圾收回?
虽然这个问题很幼稚,但也值得一说,程序在执行的过程中不断地创建对象(数据),如果 Flash Player 不执行垃圾回收,很快内存就会爆满,然后程序崩溃(甚至电脑崩溃)。

不仅仅是AS3有垃圾回收,其他程序一样也是有垃圾回收机制的,只不过AS3的垃圾收回机制基本是自动的,不需要我们手动调用。

2. GC 是什么?
GC(Gabage Collection)就是强制执行垃圾收回,在AS3中有 System.gc() 静态方法可以让 Flash Plyaer 立即执行垃圾回收,但此方法仅限于 Flash Player 调试版和 AIR 应用程序(而且还有一些限制,具体查询API)。

其实Flash Player可以通过一些特殊方法(例如:如下代码),实现强制垃圾回收的效果。

[Actionscript3] 纯文本查看 复制代码
//// 强制垃圾回收,相当于GC
try
{
        new LocalConnection  .connect( "MoonSpirit" );
        new LocalConnection  .connect( "MoonSpirit" );
}
catch ( err:Error )
{
        // 处理异常(这里为空即可)
}

但我看到一个高手说这是不安全的,而且基本上我们是不需要手动垃圾回收的(难道你的程序真的大的需要手动 GC 吗?)。

3. GC 与内存泄露的关系
内存泄露指的就是当你销毁了一个对象的时候,它占用的内存却无法被回收,随着这些不能回收的对象越来越多,最终造成系统崩溃。

GC 和内存泄露是没有关系的,这些泄露的对象正是因为这些对象不被垃圾回收机制当做垃圾,所以才泄露的。理所当然强制 GC 也是徒劳了。

4. Flash Player 何时垃圾回收?
Flash Player 使用的是和 Java 相似的内存管理机制,并不会即时回收废弃对象的内存,而是在特定时间统一执行一次 GC 操作来释放废弃对象的内存,避免了重复判断是否需要回收产生的性能问题。

只有在申请内存时,如果内存占用达到一定数量,就会触发 GC,如果没有到达则不进行 GC。

5. Flash Player 中垃圾回收的条件
在 AVM2 中,除去特殊的 BitmapData 必须调用 dispose() 才能回收内存外,其他的部分都是“用引用计数法”和“标记清除法”作为判断是否应该回收内存的手段。

这里说的“引用”是和变量中的引用是一个概念。

引用计数法:只要对象A不被任何对象引用,则对象A的内存占用会在 Flash Player 执行 GC 的时候清除。下面是一个相互引用的例子:
[Actionscript3] 纯文本查看 复制代码
var a : Object = {};
var b : Object = { obj : a };
a.obj = b;
a = null;
b = null;

// 这时候,a和b对象互为引用,即使使用 null 也是无法完全清除他们的引用计数的


这种情况的对象(互为引用),引用计数法是无法回收对象内存的,也就是无法对该对象进行垃圾回收。

标记清除法就是用来解决上面的互为引用,无法进行垃圾回收的情况的。

标记清除法:从程序的根对象开始(stage,静态属性,活动的定时器和加载器,ExternalInface.callBack)一级一级遍历对象,只要遍历不到,即使不满足引用计数法的条件也可以回收。

比起单纯的引用计数,标记清除法确实能找到已经无法再访问到的实际上的闲置对象。所以,可以看到很多人的代码实际上并没有设置 null,甚至没有 removeEventListener,它一样可以被正常回收,少写这些代码可以使得程序更简洁,要全部符合标记清除法的条件,会很累。

6. 注意事项
如果使用了弱引用,addEventListener 将不会影响对象回收,但是这同时也是缺点,因为有的时候你就是希望用引用限制住对象的回收。如果使用弱引用则可能极少数情况引发一些BUG,而且很难查别。

所以不要使用弱引用,而且侦听器的建议应该是不需要就及时 removeEventListener。

BitmapData 对象一定要记得手动调用 dispose()。

BitmapData 是32位的未经任何压缩的图像,随便一个体积都会非常大,不处理好它们的回收,一个 BitmapData 泄露就可以顶你数万个复杂对象的泄露。


结束语
我只说一些垃圾回收机制的重点和要点,至于更多的细节知识可以去百度搜索。

愿大家的程序都是高效的,没有内存泄露,不会程序刚一运行苹果平板就自动发热~~~~

这是上面测试的swf的源文件:
Flash Player强制执行垃圾回收.zip (50.1 KB, 下载次数: 11)



免费是最昂贵的
银子还是要收的,因为 “免费的东西最昂贵” ,请深刻理解这句话的含义!!!


广告
QQ(TKCB):2414268040(欢迎和我聊天交流,有朋自远方来不亦说乎)
QQ群:96759336(AS3殿堂之路,Flash Animate AS3 AIR 技术交流)
QQ群:705730359(H5天路历程,HTML5 CSS3 JaveScript  技术交流)
QQ群:463560360(King系列软件分享交流,TKCB 出品的 King 系列软件分享、使用、交流、反馈等)
TKCB网站:www.tkcb.cc
官方技术论坛:www.11ria.com

本帖被以下淘专辑推荐:

发表于 2019-2-25 22:12:56 | 显示全部楼层
不错的贴子!!!
回复

使用道具 举报

发表于 2019-3-22 16:18:01 | 显示全部楼层
试试看看效果   
回复

使用道具 举报

发表于 2019-3-31 21:23:05 | 显示全部楼层
向高手学习!
回复

使用道具 举报

发表于 2019-4-5 11:48:28 | 显示全部楼层
脚本离不开优化,感谢经验分享!
回复

使用道具 举报

发表于 2019-4-6 11:40:12 | 显示全部楼层
好文,对于开发大型项目来说内存控制非常重要。
接下去进阶就该介绍对象池和对象复用了吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表