概述

在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很难,关键是在出现问题的时候该怎么去排查。

android oom工具,Android OOM-Heap,MAT工具检测内存泄露相关推荐

  1. Android Studio检测内存泄露和性能

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中.  一般情况下,高密度 ...

  2. android中momery检测,Android性能优化第(二)篇---Memory Monitor检测内存泄露

    版权声明:本文为LooperJing原创文章,转载请注明出处! 多练习多写代码.jpg 上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露 ...

  3. iPhone Instruments工具使用_检测内存泄露(转)

    最近常使用Instruments这个工具,我发现它对追踪游戏中的内存泄露非常有帮助.自从发现Instruments如此有用后,我就觉得写一篇文章介绍如何使用它来追踪内存泄露对其他人也会有帮助. 什么是 ...

  4. 如何使用MAT进行JVM内存泄露分析

    转载自  如何使用MAT进行JVM内存泄露分析 在<Java Agent的隔离实现以及卸载时一些坑>中,卸载Agent之后,使用 jmap-histo:live pid命令验证执行FGC, ...

  5. leaks Android内存泄露,Android LeakCanary 检测内存泄露

    内存泄漏: 指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光 内存泄露危害: 1.内存泄露最终会导致内存溢出(OOM) 2.导 ...

  6. Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

    本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...

  7. 使用android studio查看内存,Android Studio Profiler使用心得 检测内存泄露问题

    最近在分析app的内存泄露问题研究了下as的profiler功能  这里记录下个人心得 下面是个人心得 1.首先得出结论profiler不详细提供分析c或c++库进行的内存占用 其中包括android ...

  8. [Swift通天遁地]七、数据与安全-(12)使用Instruments Leaks工具检测内存泄露

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  9. python 内存泄漏分析工具_记一次调试python内存泄露的问题

    这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-debuging-coding-debuging之后, 终于上线了, 上线后心里美滋滋 ...

最新文章

  1. HDU 1431 素数回文
  2. 英特尔中国换帅,迎来史上首位女董事长,原总裁杨旭年底退休
  3. flink 4-输出
  4. [react] 在React中你有经常使用常量吗?
  5. Unity美术字体教程--BMFont美术字体的制作流程以及在unity中美术字体的生成
  6. 4227. 【五校联考3day2】B (Standard IO)
  7. Xftp的下载、安装、使用
  8. macOS中快速打开终端
  9. 开发一个 app 有多难?需要多少钱?
  10. 4G图传移动视频取证-可视安全生产监管-常见问题解答FAQ
  11. eeplat中遇到日期先后校验问题的解决
  12. 思科高级配置(配置标准ACL)
  13. 数理逻辑4 -- 公理化集合论16
  14. 电磁感应式无线充电系统详解
  15. Android中App控制字体大小
  16. java基础学习总结(二)——开篇(转载于孤傲苍狼博主的心得体会)
  17. 计算机科学类专升本复习之“C语言fopen函数的用法”详解(初稿)
  18. 服务器护卫神怎么上传文件,护卫神备份文件的方法
  19. 电子数据取证之Android APK分析
  20. 操作系统概念笔记——第六章:进程同步

热门文章

  1. html scale方法的作用,HTML Canvas scale() 方法
  2. 1101: 逆序数字(函数专题)
  3. 《团队激励与沟通》第 7 讲——团队合作概述 重点部分总结
  4. 堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系
  5. java 可逆的加密算法_java实现AES可逆加密算法
  6. python中代理模式分为几种_通俗 Python 设计模式——代理模式
  7. 怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 5 迅速判断回文串的Manacher算法...
  8. css html 双面打印_从 Linux 命令行进行打印 | Linux 中国
  9. android 尺寸变化动画,Android ScaleAnimation类:尺寸变化动画类
  10. 二叉树的层序遍历和前中后序遍历代码 迭代/递归