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

下载本文档

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

文档简介

Android内存管理泄漏调试技巧第1页/共18页Java层强引用即使虚拟内存吃紧,也不会导致对象被回收。弱引用当虚拟机OOM前,软引用会被强制回收。软引用虚引用第2页/共18页Android每个应用程序都会使用一个专门的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的。一旦程序出现内存泄漏的问题,仅仅会使自己的进程被kill掉,不会影响其他进程。不同类型的进程有不同的内存使用上限。init.rc第3页/共18页引起内存泄漏的情况查询数据库没有关闭游标Cursorcursor=null;try{

cursor=getContentResolver().query(uri...);if(cursor!=null&&cursor.moveToNext()){......}}finally{if(cursor!=null){try{

cursor.close();}}}第4页/共18页构造Adapter时,没有使用缓存的convertView。publicViewgetView(intposition,View convertView,ViewGroupparent){Viewview=null;if(convertView!=null){view=convertView;populate(view,getItem(position));...}else{view=newXxx(...);...}returnview;}初始化时ListView会从BaseAdapter中根据当前屏幕布局实例化一些数量的View,同时ListView会将这些view对象缓存起来。当向上滚动Listview时,原先位于最上面的listview会被用来构造新出现的最下面的listItem。这个构造过程是由getView对象方法完成的。缓存的数据放在convertView中。因此,如果在getView中每次都不去使用convertView重新实例化一个View对象,即会导致内存泄漏。第5页/共18页Bitmap对象不在使用时需要调用recycle()释放内存由于Bitmap对象比较占用内存,当它不再被使用的时候,可以调用Bitmap.recycle()方法回收此对象。第6页/共18页引用导致的内存泄漏全局变量引用一个对象publicclassDemoActivityextendsActivity{...privateHandlermHandler=...privateObjectobj;publicvoidoperation(){

obj=initObj();...mHandler.post(newRunnable(){publicvoidrun(){useObj(obj);}});}由于obj是全局变量,因此当mHander即使使用完成后,由于DemoAcitivity还在,所以initObj()的内存并没有被释放。可以将obj改为局部变量,然后再传给mHandler第7页/共18页应用导致的内存泄漏一个生命周期短的对象A,被一个生命周期长的对象B引用。

例子:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。

但是如果在释放LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象,则会导致LockScreen无法被垃圾回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process进程挂掉。第8页/共18页分析步骤以查询光标没有关闭导致内存泄漏为例利用Heap,找到内存泄漏的操作。(先要作GC)第9页/共18页分析步骤使用AllocationTracker对这一操作进行跟踪;重点查看相同行中多次申请的操作,结合代码分析。第10页/共18页AllocationTracker工具只反映出了Allocation的操作记录。有可能显示出来的对象其实已经释放或者会被GC。如果分析不出来,需要通过MAT工具进行进一步的查找。第11页/共18页MAT(MemoryAnalyzerTool)下载HPROF文件。使用EclipseMemoryAnalyzer工具打开。如果无法打开需要使用Android自带的hprof-conv.exe工具进行转换。抓取两份hprof文件,操作一两次,casegc抓取第一份,重复多次有内存泄漏的操作,casegc抓取第二份。第12页/共18页使用Histogram比较这两份文件的差异。找到操作前后通过GC后增加的对象,断定这些对象有内存泄漏的可能。第13页/共18页Shallowsize就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。Retainedsize是该对象自己的shallowsize,加上从该对象能直接或间接访问到对象的shallowsize之和。换句话说,retainedsize是该对象被GC之后所能回收到内存的总和。第14页/共18页由于通过MAT找到了内存泄漏的对象,但却

温馨提示

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

评论

0/150

提交评论