烟台建设联合会网站,网站建设公司 信科便宜,定制营销型网站公司,大型门户网站建设的意义概述在android的开发中#xff0c;要时刻主要内存的分配和垃圾回收#xff0c;因为系统为每一个dalvik虚拟机分配的内存是有限的#xff0c;在google的G1中#xff0c;分配的最大堆大小只有16M#xff0c;后来的机器一般都为24M#xff0c;实在是少的可怜。这样就需要我们…概述在android的开发中要时刻主要内存的分配和垃圾回收因为系统为每一个dalvik虚拟机分配的内存是有限的在google的G1中分配的最大堆大小只有16M后来的机器一般都为24M实在是少的可怜。这样就需要我们在开发过程中要时刻注意。不要因为自己的代码问题而造成OOM错误。JAVA的内存管理大家都知道android应用层是由java开发的android的davlik虚拟机与jvm也类似只不过它是基于寄存器的。因此要了解android的内存管理就必须得了解java的内存分配和垃圾回收机制。在java中是通过new关键字来为对象分配内存的而内存的释放是由垃圾收集器(GC)来回收的工程师在开发的过程中不需要显式的去管理内存。但是这样有可能在不知不觉中就会浪费了很多内存最终导致java虚拟机花费很多时间去进行垃圾回收更严重的是造成JVM的OOM。因此java工程师还是有必要了解JAVA的内存分配和垃圾回收机制。内存结构上面这张图是JVM的结构图它主要四个部分组成Class Loader子系统和执行引擎运行时方法区和本地方法区我们主要来看下RUNTIMEDATA AREA区也就是我们常说的JVM内存。从图中可以看出RUNTIMEDATA AREA区主要由5个部分组成Method Area:被装载的class的元信息存储在Method Area中它是线程共享的Heap(堆)一个java虚拟机实例中只存在一个堆空间存放一些对象信息它是线程共享的Java栈java虚拟机直接对java栈进行两种操作以帧为单位的压栈和出栈(非线程共享)程序计数器(非线程共享)本地方法栈(非线程共享)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视图界面上的update heap图标点击Heap视图中的Cause GC按钮(相当于向虚拟机发送了一次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视图点击dump HPROF file按钮然后使用MAT分析下载下来的文件。下面列出了存在的问题点击detail进去会列出详细的可能会存在问题的代码关于MAT的使用可以参考这位兄弟写的比较详细。总结不管是java还是android都应该了解内存分配和垃圾回收机制工程师要做到写的代码中没有bad code很难关键是在出现问题的时候该怎么去排查。