概述

android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在googleG1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的可怜。这样就需要我们在开发过程中要时刻注意。不要因为自己的代码问题而造成OOM错误。

JAVA的内存管理

大家都知道,android应用层是由java开发的,androiddavlik虚拟机与jvm也类似,只不过它是基于寄存器的。因此要了解android的内存管理就必须得了解java的内存分配和垃圾回收机制。

java中,是通过new关键字来为对象分配内存的,而内存的释放是由垃圾收集器(GC)来回收的,工程师在开发的过程中,不需要显式的去管理内存。但是这样有可能在不知不觉中就会浪费了很多内存,最终导致java虚拟机花费很多时间去进行垃圾回收,更严重的是造成JVMOOM。因此,java工程师还是有必要了解JAVA的内存分配和垃圾回收机制。

  1. 内存结构

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

  • Method Area:被装载的class的元信息存储在Method Area中,它是线程共享的
  • Heap():一个java虚拟机实例中只存在一个堆空间,存放一些对象信息,它是线程共享的
  • Java栈:java虚拟机直接对java栈进行两种操作,以帧为单位的压栈和出栈(非线程共享)
  • 程序计数器(非线程共享)
  • 本地方法栈(非线程共享)
  1. JVM的垃圾回收(GC

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

  • 年轻代(Young)

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

  • 年老代(Tenured

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

  • 持久代(Perm

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

Android内存泄露监测

在了解了JVM的内存管理后,我们再回过头来看看,在android中应该怎样来监测内存,从而看在应用中是否存在内存分配和垃圾回收问题而造成内存泄露情况。

android中,有一个相对来说还不错的工具,可以用来监测内存是否存在泄露情况:DDMSHeap

使用方法比较简单:

  • 选择DDMS视图,并打开Devices视图和Heap视图
  • 点击选择要监控的进程,比如:上图中我选择的是system_process
  • 选中Devices视图界面上的"update heap"图标
  • 点击Heap视图中的"Cause GC"按钮(相当于向虚拟机发送了一次GC请求的操作)

Heap视图中选择想要监控的Type,一般我们会观察dataobjecttotal size的变化,正常情况下total size的值会稳定在一个有限的范围内,也就说程序中的代码良好,没有造成程序中的对象不被回收的情况。如果代码中存在没有释放对象引用的情况,那么data objecttotal size在每次GC之后都不会有明显的回落,随着操作次数的增加而total size也在不断的增加。(说明:选择好data object后,不断的操作应用,这样才可以看出total size的变化)。如果totalsize确实是在不断增加而没有回落,说明程序中有没有被释放的资源引用。那么我们应该怎么来定位呢?

Android中内存泄露定位

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

点击"dump HPROF file"按钮,然后使用MAT分析下载下来的文件。

下面列出了存在的问题,点击detail进去,会列出详细的,可能会存在问题的代码:

关于MAT的使用可以参考:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html

这位兄弟写的比较详细。

总结

不管是java还是android,都应该了解内存分配和垃圾回收机制,工程师要做到写的代码中没有bad code很难,关键是在出现问题的时候该怎么去排查。

Android 之 内存管理相关推荐

  1. Android之内存管理-内存监测-内存优化

    推荐文章:Android进程与内存及内存泄漏 Android之内存管理 1.1 Dalvik Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础.其指令集基于寄存 ...

  2. Android手机内存管理与性能优化

    Android手机内存管理与性能优化&JNI.NDK高级编程(JNI.Dalvik.内存监测) 课程分类:Android 适合人群:中级 课时数量:34小节课时 用到技术:Dalvik,DDM ...

  3. Android ION 内存管理

    ION的设计初衷 Android为了更好的针对移动设备内存的管理,设计出了ION内存管理机制,主要是为了解决以下几个问题: 预留大块连续内存,比如camera,display,GPU等模块 避免内存随 ...

  4. Android内存优化—Android的内存管理方式

    内存管理机制 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面 ...

  5. Android 进程/内存管理误区

     [转载自:http://www.cnbeta.com/articles/151415.htm ] 感谢Coldwings的投递 新闻来源:自写 去年自己就弄了一台i5700,主要用来编程时候做试 ...

  6. android 内核内存管理,Android内核相关内容总结

    要想充分掌握Android这一操作系统的应用,首先需要我们从Android内核的相关内容开始了解.在这里就为大家详细介绍一下相关的知识. Android操作系统是由谷歌推出的一款基于Linux平台开源 ...

  7. Android系统如何管理自己内存的?

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 机缘巧合写下这篇博客,作为个人工作经验的总结,不足之处,随后补上. 安卓是基于Linux2.6内核的 ...

  8. Android内存管理机制详解,【安卓知识普及贴】之关于安卓内存管理机制的一些介绍和阐述。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 安卓系统其实不需要极度精简,只是一味的精简并不会给系统带来什么好处反而只有害处,因为许多系统应用跟设置里的选项有关联,删除掉就会在选择关联选项的时候FC, ...

  9. Android 内存管理机制

    本文主要包括三大部分内容: 内存管理基础:从整个计算机领域简述主要的内存管理技术. Linux的内存管理机制:Android毕竟是基于Linux内核实现的操作系统,因此有必要了解一下Linux的内存管 ...

最新文章

  1. centosx64 6.3安装视频组件
  2. python培训好学吗-Python爬虫培训好学吗?
  3. Leaflet实现地图分屏联动
  4. python程序设计题答案_《Python程序设计》习题与答案
  5. [Mac]Python 安装MySQLdb模块
  6. 无意中发现的一份清华大佬的刷题笔记!
  7. 我的docker随笔7:docker容器与主机之间文件拷贝
  8. Android浏览图片,点击放大至全屏效果
  9. 如何在npm上发布项目
  10. POJ2258 ZOJ1947 UVA539 The Settlers of Catan题解
  11. 将中缀表达式转换为前缀表达式:
  12. 存储服务器之间的传输速度与服务器内部读写速度_3000MB/s读写带来的PC体验升级,东芝RD500固态硬盘评测...
  13. qpsk调制matlab实现,QPSK调制与解调系统的MATLAB实现
  14. Micrium uC-Probe STM32调试工具 ucosIIucosIII
  15. 计算机设备管理器无com,计算机无设备管理器的方法
  16. 找不到战网服务器ip地址,wow服务器ip地址-我怎么知道战网服务器的IP地址去PING, – 手机爱问...
  17. 游戏付费用户RFM分析案例
  18. pythoneval函数错误_python中eval函数未实现错误
  19. unbuntu16.4 64位安装spade+XMPP教程
  20. 使用BenchMarkSQL测试openGauss

热门文章

  1. C语言实现PID算法
  2. 豆豆TXT阅读器1.0发布
  3. java判断文件结束_关于java读取文件时,如何判断读取文件是否到达末尾?
  4. 17年iPhone炫酷铃声,mp3、m4r格式下载
  5. layui 动态设置radio选中
  6. 写给那些正在找工作的朋友
  7. ssh框架jackjson升级
  8. windows7 android 驱动,Win7系统安装手机驱动的方法【图文】
  9. 选购家用计算机配置方案汇报,开网店、普通家用、办公、炒股、学习等用途的入门电脑主机配置...
  10. 计算机一次传输多少kb,电脑知识:1M等于多少Kb