跟踪内存分配
一.最新SDK添加的内容.
1.Android 已经到了最新的2.1版本. 其中新增了功能叫live-wallpapers.
<uses-feature android:name="android.software.live_wallpaper" />
看来,桌面要留住用户,界面的效果很重要,google也意识到这点。
2. Android 版本对应的设备统计
这个统计结果可以让我们对Android各个版本的支持做到有的放矢。重点该支持那个版本就是一目了然。
3. 新增Android 技术文章。
以上这些文章作为Android的开发人员务必要读透,要深究。很多文章有中文翻译,但我觉得还是读原汁原味的好。我还是关注内存,如果大家记得,我上次的创新文档就是讲内存的,这次还是要讲内存。我从以上的文章选了一篇<<跟踪内存分配>> 进行翻译,有不足之处,希望大家指正。
另外, 还有其他的新功能我就在这不一一列举了,大家可以看最新SDK.
二.跟踪内存分配
写一个高效的移动应用并不是那么容易的. 尤其像Android应用通过Dalvik垃圾回收器自动管理内存, 如果你不注意内存分配,将会导致性能问题。
在性能敏感的代码路径,比如layout 或者view的draw方法或者一个游戏的逻辑代码, 任何多余分配都将导致性能问题. 由于过多的分配,垃圾回收器将停掉你的应用程序而去回收内存。而大多数情况,垃圾回收器发生地足够快而让你无法察觉。然后当回收器发生在你滚动列表或你在玩某个游戏,你会发觉到性能问题。垃圾回收器花100或者200毫秒就有点问题了。相对来说,一个流畅的活动需要每桢渲染在16至33毫秒.如果一个活动十桢内有个突然的中断,确信用户将有所察觉。
大多时间,垃圾回收器将对数万个小的而且生命周期短的对象进行回收。一些垃圾回收器,如自动化垃圾回收器,能够优化这些对象回收而让应用不需要频繁中断。很不幸,Android 垃圾回收器并没有如此的优化以至于这些生命周期较短的对象如果出现关键代码路径,这对你的应用程序程序将是一个灾难。
为了帮助你避免频繁地进行垃圾回收,Android SDK提交了一个非常有用的工具,叫做分配跟踪器(allocation tracker). 这个工具是DDMS的一部分。为了启动你的分配跟踪器,你必须启动DDMS的标准版本,该工具位于SDK的Tools目录。包含在eclipse插件中的DDMS并没有提供分配跟踪器。
一旦DDMS运行,简单地选择你的应用进程然后点击分配跟踪器页签。如下图
即使在你的关键代码路径移除所有的分配可能没有必要,分配跟踪器将帮助你在代码定位到重要的问题所在。比如,一个在许多应用中常见的错误,就是在每个draw中执行New Paint操作。将paint放到一个单实例域将会对性能有很大提高。我非常鼓励你细读Android的源代码,看他们是如何在关键代码路径减少内存分配。你将发现Android 的Api将帮助你重用对象。