Android生态系统的设备发展非常繁荣,现在有手机、平板、穿戴设备、投影、Tango, Cardboard, 甚至还有汽车。懂行的开发人员都知道,要想在所有这些平台上创建稳定一致的性能,最重要的规则肯定和一个简单的因素挂钩——内存。我是Alex Danilo, 优化应用的内存使用,和与之相关的性能的关键,与熟练巧妙运用Android SDK 的内存工具密不可分。现在开始吧。
值得注意的是,应用内存的进进出出可比简单的对象配置和释放复杂多了。特别是具有垃圾回收机制的语言,像Java语言。只要资源需要被释放,垃圾回收时间就会出现在你的代码中,通常这是一件好事。
但是如果你的代码没有合理的使用内存,那么可能会出现一堆垃圾回收事件,消耗掉你的性能。
你可以使用Android Studio 里的 Memory Monitor (内存监控)工具来了解你的应用使用了多少内存。这个简单的工具会展示图像,图像差不多每秒都会更新,向你展示你的应用当前使用了多少内存,还剩多少可以使用的内存。
每当条纹深蓝色条形下降时,就代表出现了一个垃圾回收事件,释放了应用的内存。
而且如果在短时间内看见了很多这种下降,有可能你的代码里发生了疯狂的事,正在消耗你的应用性能。
可惜,内存监控太简单,不足以帮你追踪出这个疯狂的事件发生在何处。如果我们想要更多细粒度的知识,了解我们内存的状态,哪些对象正在占用空间,我们可以使用DDMS内一个实用的工具,它就是 Heap Viewer (堆栈查看器) ,这个工具允许你查看某个进程使用了多少堆内存,这很实用,可以在你的各项应用执行项中准确定位到疯狂占用内存的位置。
当你打开DDMS 并连接好你的手机时,你可以点击这个堆更新按钮,这会打开用户信息管理系统,开始记录堆信息。
点击这个按钮之后,点击堆标签栏,这也是数据显示将会出现的地方。现在你会看到已选择应用的java堆内存信息。
现在注意这个标签栏上方的文字,文字显示说堆更新将发生在本客户端每次垃圾回收之后进行。点击“引起垃圾回收 (cause GC) ”来更新你的数据,你会看见数据表格会迅速更新,向你展示堆上哪些数据现在可用及活跃。
当你选择一个数据类型后,底部面板将会更新,显示配置数据的柱状图和具体的内存大小。
比如,在这里你能看见堆上有超过100个对象,显示为单字节数组,总大小为48字节。同时,看来这里还有一个单字节数组对象,有3.8兆。这个工具能很好的帮你查看应用配置了哪些对象及其在堆上的大小。比如,如果你在堆上看到了这种3兆的位图对象,即使你已经销毁了这个Activity,你仍然需要担心内存泄漏。
可惜的是,这个视图不能告诉你,数据被配置到了你代码的何处。
对此,我们需要一个新工具,Alloction Tracker(配置追踪器),你可以在 Android Studio加载,在视图底部点击Android标签栏,这会有效的提出一个DDMS版本,在你的IDE内停驻运行。
一旦与你的设备连接并选择了可除错的应用后,你可以点击“开始配置追踪”标签,然后开始运行应用一段时间。
当你完成后,你可以点击“停止配置追踪”标签。请注意,根据你运行时间的长短,这可能要花费一段时间来完成。所以稍微等一等把。
你会发现在你的IDE上方出现了新的标签,他列出了在你的分析的时间段内所有的配置。这个视图的每一行都代表了发生的配置。这个顺序栏显示了这个配置发生的顺序。这个类别栏显示了配置数据的类型,它是一个阵列,还是一个特殊类别的对象,大小栏以字节为单位显示了配置的大小。线程ID栏告诉你哪个线程配置浏览这个数据。这个配置位置栏显示了负责配置这个内存的具体功能。
当你点击一个配置,面板底部会更新,显示这个配置的完整调用堆栈。这个工具对定位问题,比如内存抖动非常有效。如果你发现一大堆相似的对象被配置一个接着一个,他们的配置顺序非常接近,然后你就发现了一个优化集中点。