android内存优化详解 联系客服

发布时间 : 星期六 文章android内存优化详解更新完毕开始阅读

上面这张图是JVM的结构图,它主要四个部分组成:Class Loader子系统和执行引擎,运行时方法区和本地方法区,我们主要来看下RUNTIME DATA AREA区,也就是我们常说的JVM内存。从图中可以看出,RUNTIMEDATA AREA区主要由5个部分组成:

? Method Area:被装载的class的元信息存储在Method Area中,它是线程共享的 ? Heap(堆):一个java虚拟机实例中只存在一个堆空间,存放一些对象信息,它是

线程共享的

? Java栈: java虚拟机直接对java栈进行两种操作,以帧为单位的压栈和出栈(非

线程共享)

? 程序计数器(非线程共享) ? 本地方法栈(非线程共享)

2. JVM的垃圾回收(GC)

JVM的垃圾原理是这样的,它把对象分为年轻代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的垃圾回收算法。 ?

年轻代(Young)

年轻代分为三个区,一个eden区,两个Survivor区。程序中生成的大部分新的对象都在Eden区中,当Eden区满时,还存活的对象将被复制到其中一个Survivor区,当此Survivor区的对象占用空间满了时,此区存活的对象又被复制到另外一个Survivor区,当这个Survivor区也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制到年老代。 ?

年老代(Tenured)

年老代存放的是上面年轻代复制过来的对象,也就是在年轻代中还存活的对象,并且区满了复制过来的。一般来说,年老代中的对象生命周期都比较长。 ?

持久代(Perm)

用于存放静态的类和方法,持久代对垃圾回收没有显著的影响。

Android中内存泄露监测

在了解了JVM的内存管理后,我们再回过头来看看,在android中应该怎样来监测内存,从而看在应用中是否存在内存分配和垃圾回收问题而造成内存泄露情况。 在android中,有一个相对来说还不错的工具,可以用来监测内存是否存在泄露情况:DDMS—Heap

使用方法比较简单: ? ? ? ?

选择DDMS视图,并打开Devices视图和Heap视图

点击选择要监控的进程,比如:上图中我选择的是system_process 选中Devices视图界面上的\图标

点击Heap视图中的\按钮(相当于向虚拟机发送了一次GC请求的操作) 在Heap视图中选择想要监控的Type,一般我们会观察dataobject的 total size的变化,正常情况下total size的值会稳定在一个有限的范围内,也就说程序中的代码良好,没有造成程序中的对象不被回收的情况。如果代码中存在没有释放对象引用的

情况,那么data object的total size在每次GC之后都不会有明显的回落,随着操作次数的增加而total size也在不断的增加。(说明:选择好data object后,不断的操作应用,这样才可以看出total size的变化)。如果totalsize确实是在不断增加而没有回落,说明程序中有没有被释放的资源引用。那么我们应该怎么来定位呢?

Android中内存泄露定位

Mat(memory analyzer tools)是我们常用的用来定位内存泄露的工具,如果你使用ADT,并且安装了MAT的eclipse插件,你需要做的是进入DDMS视图的Devices视图:

点击\按钮,然后使用MAT分析下载下来的文件。