码迷,mamicode.com
首页 > 其他好文 > 详细

应用性能优化

时间:2016-05-12 13:18:05      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

内存管理

垃圾回收机制

1、什么是垃圾回收机制?

(1)垃圾回收器负责回收程序中已经不再使用,但是仍然被各种对象占用的内存。

(2)无需手动管理内存,android系统会自动跟踪所有的对象,并释放那些不再被使用的对象。

缺点:垃圾回收机制是一把双刃剑,在提高程序员工作效率的同时,会对应用程序的性能造成影响,严重的会是应用程序卡顿等。

技术分享

技术分享

峰值后占用内存减少,是系统进行了一次垃圾回收。

技术分享

系统在垃圾回收时可能会暂停当前程序的执行,这样有可能会导致某一帧的绘制超过了16ms,用户就会感觉卡顿。

一个典型场景就是 内存泄露

内存泄露

技术分享

内存泄露指的是应用程序在运行时分配了一些的对象,这些对象所占用的内存并不能被垃圾回收程序所回收 一一 导致系统可分配内存越来越少 一一 新对象的创建需要的内存不够 一一 调用垃圾回收程序执行一次垃圾回收 一一 垃圾回收可能会暂停当前程序的执行 一一 可能会导致某一帧的绘制超过16ms,影响到当前的帧率 一一 帧率达不到60fps 一一 用户感到卡顿。

内存检测工具

1、Memory Monitor

技术分享

2、Allocation Tracker

技术分享

技术分享

主要用来追踪应用程序在运行时,所有已创建的对象、对象的数量、占用内存大小、以及这些对象是在哪些方法中被创建出来的信息。
点击图上2处,再次点击Allocation Tracker,AS会打开Allocation Tracker统计结果。

技术分享

3、Heap Viewer

工具可实时展示应用程序在运行时所有已分配对象的数量、大小、类型等信息。

技术分享

总结:
1、Memory Monitor
方便显示内存使用和GC情况;
快速定位卡顿是否和GC有关;
快速定位Crash是否和内存占用过高有关;
快速定位潜在的内存泄露问题;
缺点:不能准确定位问题,只能提供大概的方向。

2、Allocation Tracker
定位代码中分配的对象的类型、大小、时间、线程、堆栈等信息;
定位内存抖动问题;
配合Heap Viewer一起定位内存泄露问题
缺点:使用复杂。

3、Heap Viewer
内存快照信息
每次GC之后收集一次信息
查找内存泄露利器
缺点:使用复杂。

4、LeakCanary
开源库

常见的内存泄露问题

1、单例造成的内存泄露

技术分享

静态变量在整个程序的运行期间是一直存在的,不会被垃圾回收;静态变量本身会持有一个activity对象的引用的,activity对象即使被销毁了也不会被垃圾回收,从而造成了内存泄露。

2、非静态内部类的静态实例造成的泄露

技术分享

TestResource是在MainActivity定义的非静态内部类,
其对象sResource对象会间接的持有MainActivity实例的引用,又把sResource定义为静态变量,所以在程序运行期间sResource对象不会被垃圾回收,并且一直持有MainActivity的引用,导致MainActivity也不会被垃圾回收。

3、Handler造成的内存泄露

技术分享

创建一个匿名内部类的对象,它会间接持有外部类实例的引用;Handler经常用来做耗时的操作,可能存活时间比MainActivity实例时间长,所以可能会导致MainActivity销毁后并不能被垃圾回收,必须要等Handler被垃圾回收之后,MainActivity对象才会被垃圾回收。

避免内存泄露的方法:

1、尽量不要让静态变量引用Activity;如果要用,尽量使用WeakReference;
2、使用静态内部类来代替内部类(静态内部类不会持有它外部类的引用);
3、静态内部类使用弱引用来引用外部类

减少内存使用

技术分享

应用性能优化

标签:

原文地址:http://blog.csdn.net/sinat_16640839/article/details/51366421

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!