Category: Develop


前文我们介绍了GC的工作机制和帮助GC更好工作的最佳实践。其实只要我们遵守谁创建谁清理的原则来管理对象,就能基本上避免回收失败,也就是我们通常说的内存泄漏问题。但是在实际项目中我们还会看到各种原因引起的内存泄漏,接下来就让我们一起来找出病因。

首先我们需要观察症状,也就是内存的使用曲线。排查的方法是反复执行一些创建和删除对象的方法、反复加载和卸载子文件。如果内存曲线一路飙升、或者是居高不下,都表明发生了内存泄漏问题。观察内存占用可以直接求助于操作系统的资源管理器,也可以用Hi-ReS-Stats这个类。

第二个需要观察的地方,是Player输出的load和unload信息。加载和卸载外部文件,是内存泄漏问题的重灾区。在调试阶段,我一般会在主文件加一个执行System.gc()语句的按钮。一旦卸载了一个子文件,就手动触发若干次GC。如果没有输出子文件的卸载信息,那么就说明出现泄漏了。 View full article »

在《给AS程序员的一点建议一文》中我提到了释放资源的重要性。最近在一些项目过程中我又对这方面有了更多的理解,在此希望能够分享给大家。首先让我们来回顾一下关于垃圾回收(Garbage Collection,下文简称GC)的一些知识。要阅读本文,你需要对GC机制有些基本认识。

在ActionScript中,我们没有API可以直接删除一个对象,也不能控制Player进行GC。但是GC的行为是可以预估的,作为开发者,我们需要了解的是GC执行的时机是发生在需要向操作系统请求分配内存的时候。

从上面的模拟图我们可以看到:

  • Player以块的方式请求和释放内存。GC的结果不一定就是更少的内存占用,也有可能是从操作系统获得更多的可用内存。
  • Player会在某些GC过程中把内存中未使用部分组合成可以释放的块还给操作系统。
  • 此外还要注意的是Player为了避免占用太多的CPU资源,会将一些GC操作分到不同的时间片中运行,所以一次GC过程并不一定清理完所有可回收资源。

一次GC过程(GC Pass)分为以下两个步骤: View full article »

最近在项目中遇到一个问题。某个从SWC库中实例化的symbol总是引起crash,检查了一下发现如果存为CS5的版本发布就没有问题。于是就顺藤摸瓜发现了CS5.5的一个小问题。新的属性面板(下图)包含了一个设置visible的参数,方便我们不需要写AS代码就可以设置这个常用的参数。引起crash的symbol正是用了这个小功能。如果像我那样发布出SWC再用SDK编译,可能就会在实例化的时候没有任何报错地直接crash。

分析使用了这个功能的swf文件,发现并没有生成任何AS代码。那么应该是Flash IDE隐藏的工作吧,只是不知道这个功能的内部实现机制是什么。虽然这个功能很贴心,但是使用SWC工作流程的同学们还是暂时无视吧。

Powered by KevinCao.com ©2010 | Platform: WordPress | Theme: Motion
kevincao.com