Android内存管理泄漏调试技巧课件_第1页
Android内存管理泄漏调试技巧课件_第2页
Android内存管理泄漏调试技巧课件_第3页
Android内存管理泄漏调试技巧课件_第4页
Android内存管理泄漏调试技巧课件_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Memory Analysis 1Android内存管理泄漏调试技巧 Java 层 Native 层 2Android内存管理泄漏调试技巧 Java 层 强引用 即使虚拟内存吃紧,也不会导致对象被回收。 弱引用 当虚拟机OOM前,软引用会被强制回收。 软引用 虚引用 3Android内存管理泄漏调试技巧 Android 每个应用程序都会使用一个专门的 Dalvik虚拟机实例来运行,它是由Zygote服 务进程孵化出来的。一旦程序出现内存泄 漏的问题,仅仅会使自己的进程被kill掉, 不会影响其他进程。 不同类型的进程有不同的内存使用上限。 init.rc 4Android内存管理泄漏调试技巧

2、引起内存泄漏的情况 查询数据库没有关闭游标 Cursor cursor = null; try cursor = getContentResolver().query(uri .); if (cursor != null 5Android内存管理泄漏调试技巧 构造Adapter时,没有使用缓存的convertView。 public View getView(int position, View convertView, ViewGroup parent) View view = null; if (convertView != null) view = convertView; popula

3、te(view, getItem(position); . else view = new Xxx(.); . return view; 初始化时ListView会从BaseAdapter中根 据当前屏幕布局实例化一些数量的 View,同时ListView会将这些view对象 缓存起来。当向上滚动Listview时,原 先位于最上面的listview会被用来构造 新出现的最下面的listItem。这个构造 过程是由getView对象方法完成的。缓 存的数据放在convertView中。 因此,如果在getView中每次都不去使 用convertView重新实例化一个View对 象,即会导致内存

4、泄漏。 6Android内存管理泄漏调试技巧 Bitmap对象不在使用时需要调用recycle()释 放内存 由于Bitmap对象比较占用内存,当它不再被使 用的时候,可以调用Bitmap.recycle()方法回收 此对象。 7Android内存管理泄漏调试技巧 引用导致的内存泄漏 全局变量引用一个对象 public class DemoActivity extends Activity . private Handler mHandler = . private Object obj; public void operation() obj = initObj(); . mHandler.

5、post(new Runnable() public void run() useObj(obj); ); 由于obj是全局变量,因此当mHander 即使使用完成后,由于DemoAcitivity还 在,所以initObj()的内存并没有被释放。 可以将obj改为局部变量,然后再传给 mHandler 8Android内存管理泄漏调试技巧 应用导致的内存泄漏应用导致的内存泄漏 一个生命周期短的对象A,被一个生命周期长的对象B引用。 例子:假设我们希望在锁屏界面(LockScreen)中,监听系统中 的电话服务以获取一些信息(如信号强度等),则可以在 LockScreen 中定义一个Phone

6、StateListener 的对象,同时将它注 册到TelephonyManager 服务中。对于LockScreen 对象,当需要 显示锁屏界面的时候就会创建一个LockScreen 对象,而当锁屏 界面消失的时候LockScreen 对象就会被释放掉。 但是如果在释放LockScreen 对象的时候忘记取消我们之前 注册的PhoneStateListener 对象,则会导致LockScreen 无法被垃 圾回收。如果不断的使锁屏界面显示和消失,则最终会由于大 量的LockScreen 对象没有办法被回收而引起OutOfMemory,使得 system_process 进程挂掉。 9Andr

7、oid内存管理泄漏调试技巧 分析步骤 以查询光标没有关闭导致内存泄漏为例 利用Heap,找到内存泄漏的操作。(先要作GC) 10Android内存管理泄漏调试技巧 分析步骤 使用Allocation Tracker对这一操作进行跟踪;重点查 看相同行中多次申请的操作,结合代码分析。 11Android内存管理泄漏调试技巧 Allocation Tracker工具只反映出了Allocation 的操作记录。有可能显示出来的对象其实 已经释放或者会被GC。 如果分析不出来,需要通过MAT工具进行进 一步的查找。 12Android内存管理泄漏调试技巧 MAT(Memory Analyzer Too

8、l) 下载HPROF文件。 使用Eclipse Memory Analyzer工具打开。 如果无法打开需要使用Android自带的hprof- conv.exe 工具进行转换。 抓取两份hprof文件,操作一两次,case gc 抓取第一份,重复多次有内存泄漏的操作, case gc 抓取第二份。 13Android内存管理泄漏调试技巧 使用Histogram比较这两份文件的差异。 找到操作前后通过GC后增加的对象,断定这些对象有内 存泄漏的可能。 14Android内存管理泄漏调试技巧 Shallow size就是对象本身占用内存的大小,不 包含对其他对象的引用,也就是对象头加成员 变量(不是成员变量的值)的总和。在32位系 统上,对象头占用8字节,int占用4字节,不管 成员变量(对象或数组)是否引用了其他对象 (实例)或者赋值为null它始终占用4字节。 Retained size是该对象自己的shallow size,加上 从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被 GC之后所能回收到内存的总和。 15Android内存管理泄漏调试技巧 由于通过MAT找到了内存泄漏的对象,但却无 法确认对象

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论