欢迎来到天天文库
浏览记录
ID:45564492
大小:55.20 KB
页数:16页
时间:2019-11-14
《Android开发内存泄漏及检查工具使用培训资料》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Android开发内存泄漏及检查工具使用培训资料目录1内存泄露31」内存泄露的概念31.2开发人员注意事项41.3Android(java)中常见的引起内存泄露的代码示例4131查询数据库没有关闭游标61.3.2构造Adapter时,没有使用缓存的convertView61.3.3Bitmap对彖不在使用时调用recycle()释放内存71.3.4释放对象的引用81.3.5其他92内存泄露的分析工具92.1内存监测工具DDMS->Heap92.2内存分析匚具MAT(MemoryAnalyzerTool)102.2.1生成.hprof文件102.2.2使用MAT导入.hprof文件112.2.
2、3使用MAT的视图工具分析内存121内存泄露Android应用程序开发以Java语言为主,而Java编程中一个非常重要但却经常被忽视的问题就是内存使用的问题。Java的垃圾回收机制(GarbageCollection以卜简称GC)使得很多开发者并不关心内存使用的牛命周期,只顾着巾请内存,却不手动释放废弃的内存,而造成内存泄露,引起很多问题,甚至程序崩溃。Android的虚拟机DalvikVM和java虚拟机JVM没有什么太人的区别,只是在字节码上稍做优化,所以Android应用开发中同样会出现内存泄歸的问题。而>1•由于Android智能平台主要用于嵌入式产品开发,可用的内存资源更加稀少,所
3、以对于我们Android应用开发人员来说,就更该了解Android程序的内存管理机制,避免内存泄露的发生。1.1内存泄露的概念在计算机科学中,内存泄漏(memoryleak)指甫于疏忽或错误造成程序耒能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并H.通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。一般我们常说的内存泄漏是指堆内存的泄漏。堆内存
4、是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式釋放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。这里我们只简单的理解,在java程序中,如果已经不再使用一个对象,但是仍然有引用指向它,GC就无法收回它,当然该对象占用的内存就无法再被使用,这就造成内存泄露。可能一个实例对象的内存泄露很小,并不会引起很大的问题。但是如果程序反复做此操作或者长期运行,造成内存不断泄露,终究会使程序
5、无内心可川,只好被系统kill掉。在以下情况,内存泄漏导致较严重的后果:*程序运行后置Z不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的辰台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);*新的内存被频繁地分配,比如当显示电脑游戏或动画视频画而时:*程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;*泄漏在操作系统内部发牛;*泄漏在系统关键驱动中发生;*内存非常有限,比如在嵌入式系统或便携设备中;*当运行于一个终止时内存并不口动释放的操作系统(比如AmigaOS)Z上,而且一口丢失只能通过重启來恢复。1.2开发人员注意事项对于开发者,
6、对待内存泄露应该以防为主,以治为辅,因为一旦造成内存泄露,追杏原因并不容易,虽然有工具口j以利用,但是还是会耗费不必要的时间和精力來分析内存使用报告和反复搜杳代码。为了开发高性能和高质量的软件,防止出现豆腐渣工程的出现,我们要知道什么时候用gc什么时候用recycle以及到底用不用finalization,因为Java对内存的分配只需要new开发者不需要显示的释放内存,但是这样造成的内存泄露问题的儿率反而更高。我们还需要:1.了解Java的四种引用方式,比如强引用,软引用,弱引用以及虚引用。一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError的异常。2.并不要过多的指望g
7、c,不用的对象可以显示的设置为空,比如obj=null,这里提示大家,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。3.Android为每个程序分配的对内存可以通过Runtime类的totalMemory()freeMemory()两个方法获取VM的一些内存信息,对于系统heap内存获収,可以通过Dalvik.VMRu
此文档下载收益归作者所有