Android内存管理小结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

1引言 (1)

1.1编写目的 (1)

2DALVIK虚拟机初识 (1)

2.1D ALVIK优势: (1)

2.2基于栈与基于寄存器比较 (1)

2.3DEX文件格式 (3)

2.4ODEX文件格式 (3)

3内存分配跟踪工具DDMS–>ALLOCATION TRACKER 使用 (6)

4内存监测工具DDMS-->HEAP (6)

5内存分析工具MAT(MEMORYANALYZERTOOL) (8)

5.1生成.HPROF文件 (8)

5.2使用MAT导入.HPROF文件 (9)

5.3使用MAT的视图工具分析内存 (9)

6内存分配跟踪器(ALLOCATION TRACKER) (9)

7MAT使用实例 (10)

7.1生成HEAP DUMP (11)

7.2用MAT分析HEAP DUMPS (13)

7.3使用MAT比较HEAP DUMPS (14)

8常见内存使用不当情况 (14)

8.1查询数据库没有关闭游标 (15)

8.2构造A DAPTER时,没有使用缓存CONVERT V IEW (16)

8.3B ITMAP对象不在使用时调用RECYCLE()释放内存 (17)

8.4释放对象的引用 (17)

8.5C ONTEXT的使用 (19)

8.6线程 (21)

8.7单例模式导致内存泄露 (24)

8.8循环变量使用不当 (24)

8.9图片处理 (25)

8.10图片拉伸 (27)

8.11优化D ALVIK虚拟机的堆内存分配 (28)

8.12其他 (28)

9优化代码 (28)

9.1使用自身方法(U SE N ATIVE M ETHODS) (28)

9.2使用虚拟优于使用接口 (29)

9.3使用静态优于使用虚拟 (29)

9.4尽可能避免使用内在的G ET、S ET方法 (29)

9.5缓冲属性调用C ACHE F IELD L OOKUPS (29)

9.6声明F INAL常量 (30)

9.7慎重使用增强型F OR循环语句 (31)

9.8避免列举类型A VOID E NUMS (32)

9.9通过内联类使用包空间 (32)

9.10避免浮点类型的使用 (33)

9.11一些标准操作的时间比较 (34)

9.12为响应灵敏性设计 (34)

1 引言

1.1 编写目的

一个Android应用都是一个独立的进程,如何更好地少占用手机有限的内存,最大化的从代码角度进行优化,本文从Dalvik虚拟机、内存监测工具、常见内存使用不当、优化代码等几个方面进行详解,希望对Android开发者有所帮助。本文汇总了目前网上流行的处理方法,若有错误之处,敬请指正!

2 Dalvik虚拟机初识

Dalvik 虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

Dalvik VM与Apache Harmony 项目关系源远流长,因此,与JVM关系自然就密切了。然而:Dalvik VM ≠Java VM。

Dalvik基于寄存器,而JVM基于stack 。

Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。

2.1 Dalvik优势:

1、在编译时提前优化代码而不是等到运行时;

2、虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例;

3、常量池已被修改为只使用32位的索引,以简化解释器;

JVM 的字节码主要是零地址形式的,概念上说JVM是基于栈的架构。Google Android平台上的应用程序的主要开发语言是Java,通过其中的Dalvik VM来运行Java程序。为了能正确实现语义,Dalvik VM的许多设计都考虑到与JVM的兼容性;但它却采用了基于寄存器的架构,其字节码主要是二地址/三地址的混合形式。

2.2 基于栈与基于寄存器比较

基于栈与基于寄存器的架构,谁更快?现在实际的处理器,大多都是基于寄存器的架构,从侧面反映出基于寄存器比基于栈的架构更与实际的处理器接近。但对于VM来说,源架构的求值栈或者寄存器都可能是用实际机器的内存来模拟的,所以性能特性与实际硬件又有不同。一般认为基于寄存器架构的Dalvik VM比基于栈架构JVM执行效率更高,原因是:虽然零地址指

令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派(instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完成操作,指令分派与内存访问次数都较少。

我们从下面的截图可以明了的看到与同一段java代码对应的Java bytecode与Dalvid bytecode的比较:

2.3 DEX文件格式

专有的DEX文件格式一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息。dex字节码和标准Java的字节码(Class)在结构上的一个区别是dex字节码将多个文件整合成一个,这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。

原来每个类文件中的常量池现在由DEX文件中一个常量池来管理。DEX文件可以进行进一步优化。优化主要是针对以下几个方面:

1、调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的没一个域;

2、验证DEX文件中的所有类;

3、对一些特定的类进行优化,对方法里的操作码进行优化;

优化后的文件大小会有所增加,应该是原DEX文件的1-4倍。

2.4 ODEX文件格式

odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。

相关文档
最新文档