android应用程序中占用内存最多的是什么



我正在努力优化我的应用程序的内存使用情况。从广播接收器和服务到位图和静态变量,几乎无所不包。我认为我的应用程序中有很多内存泄漏,我应该处理,但它永远不会出现内存异常。

我想知道避免太多内存消耗的最佳方法是什么,我必须总是回收位图吗?因为我从来没有这样做过,用活动上下文或应用程序上下文注册广播接收器好吗?使用静态变量访问不同活动的数据安全吗?我应该给活动中的每个变量一个null值,这样它们就可以被垃圾收集吗?还是没有必要?

有很多问题,但就像我的第一个android应用程序一样,代码在某些地方做得很糟糕,但很复杂。

对于一款性能卓越、运行良好的应用程序,最佳实践是什么?

最重要的

如果您正在寻找内存优化,那么最重要的一步是检查与垃圾收集器相关的logcat消息。类似于:

12-01 19:12:09.138: D/dalvikvm(31828): GC_CONCURRENT freed 158K, 3% free 10259K/10503K, paused 15ms+0ms, total 19ms

第一个值是GC在此次运行中释放的量,第二个值是应用程序正在使用的量,而第三个值是分配给应用程序的量。最后一个值随着应用程序对内存需求的增加而增加,直到分配的内存达到系统允许的最大数量,你的应用程序就会被杀死。Honey Comb之前的SDK必须有更多的值,即Dalvik Vm之外使用的内存,通常由Bitmap对象使用。

因此,最重要的测试是使用你的应用程序一段时间,检查已使用/分配的内存值是否保持稳定或持续增加。

如果它保持稳定,你的分析就完成了,你可以去喝杯咖啡:-)

它不断增加,那么也许开始检查你的记忆力会更好。。。

该怎么办

要想充分利用内存,最基本的好规则是释放(取消)任何不再需要的对象。对于大多数非静态对象,这是自动完成的,因此您应该主要关注static对象,确保在不需要时为它们指定null。

棘手的问题

内存泄漏的最常见原因是静态对象没有得到正确管理,并且持有对的引用

  • 上下文
  • 视图(包含对上下文的引用(可能还有对位图的引用)
  • 线程(GC不定期收集)
  • 处理程序(保存对上下文的引用)
  • BitMap(主要是Honey Comb之前的版本,GC在收集它们时没有那么有效)

最终票据

如果你能花一个小时,观看谷歌IO 2011的视频,Patrick Dubroy在视频中解释了如何使用MAT来识别内存泄漏:谷歌I/O 2011:Android应用程序的内存管理。

它确实帮助我在应用程序中启动了内存隧道。

谨致问候。

我认为手册就足够了:http://developer.android.com/training/best-performance.html

最新更新