0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android内存管理机制与分析工具

Dbwd_Imgtec 来源:未知 作者:胡薇 2018-05-11 14:44 次阅读

Android 系统中有个垃圾内存回收机制,在虚拟机层自动分配和释放内存,因此不需要在代码中分配和释放某一块内存,从应用层面上不容易出现内存泄漏和内存溢出等问题,但是需要内存管理。Android 系统在内存管理上有一个 Generational Heap Memory 模型,内存回收的大部分压力不需要应用层关心, Generational Heap Memory 有自己一套管理机制,当内存达到一个阈值时,系统会根据不同的规则自动释放系统认为可以释放的内存,也正是因为 Android 程序把内存控制的权力交给了 Generational Heap Memory,一旦出现内存泄漏和溢出方面的问题,排查错误将会成为一项异常艰难的工作。除此之外,部分 Android 应用开发人员在开发过程中并没有特别关注内存的合理使用,也没有在内存方面做太多的优化,当应用程序同时运行越来越多的任务,加上越来越复杂的业务需求时,完全依赖 Android 的内存管理机制就会导致一系列性能问题逐渐呈现,对应用的稳定性和性能带来不可忽视的影响,因此,解决内存问题和合理优化内存是非常有必要的。

Android内存管理机制

Android 应用都是在 Android 的虚拟机上运行,应用 程序的内存分配与垃圾回收都是由虚拟机完成的。在 Android 系统,虚拟机有两种运行模式:Dalvik 和 ART。

1、Java对象生命周期

一般Java对象在虚拟机上有7个运行阶段:

创建阶段->应用阶段->不可见阶段->不可达阶段->收集阶段->终结阶段->对象空间重新分配阶段

2、内存分配

在 Android 系统中,内存分配实际上是对堆的分配和释放。当一个 Android 程序启动,应用进程都是从一个叫做 Zygote 的进程衍生出来,系统启动 Zygote 进程后,为了启动一个新的应用程序进程,系统会衍生 Zygote 进程生成一个新的进程,然后在新的进程中加载并运行应用程序的代码。其中,大多数的 RAM pages 被用来分配给Framework 代码,同时促使 RAM 资源能够在应用所有进程之间共享。

但是为了整个系统的内存控制需要,Android 系统会为每一个应用程序都设置一个硬性的 Dalvik Heap Size 最大限制阈值,整个阈值在不同设备上会因为 RAM 大小不同而有所差异。如果应用占用内存空间已经接近整个阈值时,再尝试分配内存的话,就很容易引起内存溢出的错误。

3、内存回收机制

我们需要知道的是,在 Java 中内存被分为三个区域:Young Generation(年轻代)、Old Generation(年老代)、Permanent Generation(持久代)。最近分配的对象会存放在 Young Generation 区域。对象在某个时机触发 GC 回收垃圾,而没有回收的就根据不同规则,有可能被移动到 Old Generation,最后累积一定时间在移动到 Permanent Generation 区域。系统会根据内存中不同的内存数据类型分别执行不同的 GC 操作。GC 通过确定对象是否被活动对象引用来确定是否收集对象,进而动态回收无任何引用的对象占据的内存空间。但需要注意的是频繁的 GC 会增加应用的卡顿情况,影响应用的流畅性,因此需要尽量减少系统 GC 行为,以便提高应用的流畅度,减小卡顿发生的概率。

内存分析工具

做内存优化前,需要了解当前应用的内存使用现状,通过现状去分析哪些数据类型有问题,各种类型的分布情况如何,以及在发现问题后如何发现是哪些具体对象导致的,这就需要相关工具来帮助我们。

1、Memory Monitor

Memory Monitor 是一款使用非常简单的图形化工具,可以很好地监控系统或应用的内存使用情况,主要有以下功能:

显示可用和已用内存,并且以时间为维度实时反应内存分配和回收情况。

快速判断应用程序的运行缓慢是否由于过度的内存回收导致。

快速判断应用是否由于内存不足导致程序崩溃。

2、Heap Viewer

Heap Viewer 的主要功能是查看不同数据类型在内存中的使用情况,可以看到当前进程中的 Heap Size 的情况,分别有哪些类型的数据,以及各种类型数据占比情况。通过分析这些数据来找到大的内存对象,再进一步分析这些大对象,进而通过优化减少内存开销,也可以通过数据的变化发现内存泄漏。

3、Allocation Tracker

Memory Monitor 和 Heap Viewer 都可以很直观且实时地监控内存使用情况,还能发现内存问题,但发现内存问题后不能再进一步找到原因,或者发现一块异常内存,但不能区别是否正常,同时在发现问题后,也不能定位到具体的类和方法。这时就需要使用另一个内存分析工具 Allocation Tracker,进行更详细的分析, Allocation Tracker 可以分配跟踪记录应用程序的内存分配,并列出了它们的调用堆栈,可以查看所有对象内存分配的周期。

4、Memory Analyzer Tool(MAT)

MAT 是一个快速,功能丰富的 Java Heap 分析工具,通过分析 Java 进程的内存快照 HPROF 分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象。

常见内存泄漏场景

如果在内存泄漏发生后再去找原因并修复会增加开发的成本,最好在编写代码时就能够很好地考虑内存问题,写出更高质量的代码,这里列出一些常见的内存泄漏场景,在以后的开发过程中需要避免这类问题。

资源性对象未关闭。比如Cursor、File文件等,往往都用了一些缓冲,在不使用时,应该及时关闭它们。

注册对象未注销。比如事件注册后未注销,会导致观察者列表中维持着对象的引用。

类的静态变量持有大数据对象。

非静态内部类的静态实例。

Handler临时性内存泄漏。如果Handler是非静态的,容易导致 Activity 或 Service 不会被回收。

容器中的对象没清理造成的内存泄漏。

WebView。WebView 存在着内存泄漏的问题,在应用中只要使用一次 WebView,内存就不会被释放掉。

除此之外,内存泄漏可监控,常见的就是用LeakCanary 第三方库,这是一个检测内存泄漏的开源库,使用非常简单,可以在发生内存泄漏时告警,并且生成 leak tarce 分析泄漏位置,同时可以提供 Dump 文件进行分析。

优化内存空间

没有内存泄漏,并不意味着内存就不需要优化,在移动设备上,由于物理设备的存储空间有限,Android 系统对每个应用进程也都分配了有限的堆内存,因此使用最小内存对象或者资源可以减小内存开销,同时让GC 能更高效地回收不再需要使用的对象,让应用堆内存保持充足的可用内存,使应用更稳定高效地运行。

常见做法如下:

对象引用。强引用、软引用、弱引用、虚引用四种引用类型,根据业务需求合理使用不同,选择不同的引用类型。

减少不必要的内存开销。注意自动装箱,增加内存复用,比如有效利用系统自带的资源、视图复用、对象池、Bitmap对象的复用。

使用最优的数据类型。比如针对数据类容器结构,可以使用ArrayMap数据结构,避免使用枚举类型,使用缓存Lrucache等等。

图片内存优化。可以设置位图规格,根据采样因子做压缩,用一些图片缓存方式对图片进行管理等等。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3841

    浏览量

    125498
  • 内存
    +关注

    关注

    8

    文章

    2737

    浏览量

    72613

原文标题:Android APP 性能优化的一些思考(二)

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式系统内存管理

    不同的系统,有不同的策略,对于有些系统支持的虚拟内存管理机制,对于另外一些系统,可能只有flat式的简单内存管理机制。 2、内存
    发表于 09-17 19:40

    控制器中如何设计MMU--虚拟内存管理机制

    控制器中如何设计MMU--虚拟内存管理机制
    发表于 12-15 09:53

    安卓应用商店和APP市场管理机制

    “工信部正在搭建移动应用软件认证和管理服务,以加强对智能终端的安全管理。”工信部相关负责人昨日表示,目前为了解决智能终端的安全问题,内部确实已经明确了需要一套对安卓应用商店和APP市场管理机制,包括上线前的审核和上线后的监测和抽
    发表于 07-15 07:41

    Keil C动态内存管理机制分析及改进,不看肯定后悔

    Keil C动态内存管理机制分析及改进,不看肯定后悔
    发表于 04-25 08:48

    怎么给RTOS动态分区内存管理机制进行优化?

    怎么给RTOS动态分区内存管理机制进行优化?
    发表于 04-28 06:17

    嵌入式系统所用到的内存管理机制主要有哪几种

    嵌入式系统所用到的内存管理机制主要有以下两种: 1、虚拟内存管理机制: 有一些嵌入式处理器提供了MMU,在MMU具备内存地址映射和寻址功能,
    发表于 12-17 06:34

    命令终端的常用操作有哪些?软件包管理机制是什么

    一.命令终端(terminal)常用操作:ctrl+shift +t,在终端上打开多个标签ctrl+alt+t,在终端上打开另外一个终端二.deb软件包管理1.Debian 软件包的管理机制 Deb
    发表于 12-21 06:38

    VxWorks内存管理机制分析与研究

    实时性、可靠性是嵌入式开发对内存管理的基本要求,本文探讨了操作系统内存管理的主要问题,对嵌入式操作系统Vxworks 的内存
    发表于 01-07 12:35 23次下载

    linux内存管理机制浅析

    本内容介绍了arm linux内存管理机制,详细说明了linux内核内存管理,linux虚拟内存管理
    发表于 12-19 14:09 73次下载
    linux<b class='flag-5'>内存</b><b class='flag-5'>管理机制</b>浅析

    TMS320F28x 事件管理机制参考

    DSP之TMS320F28x事件管理机制参考,很好的DSP自学资料,快来学习吧。
    发表于 04-15 14:48 15次下载

    最全SPARK内存管理机制

    最全SPARK内存管理机制
    发表于 09-08 14:17 5次下载
    最全SPARK<b class='flag-5'>内存</b><b class='flag-5'>管理机制</b>

    嵌入式系统内存管理机制详解

    操作系统的内存管理功能用于向操作系统提供一致的地址映射功能和内存页面的申请、释放操作。在嵌入式实时系统中,内存管理根据不同的系统,有不同的策
    发表于 11-18 09:41 4310次阅读

    嵌入式RTOS的内存管理机制的实现方案和进行改善设计

    内存资源作为嵌入式系统中极为重要的资源之一,其管理机制历来是嵌入式系统设计的重点和难点。内存管理机制的优劣程度极大地影响着嵌入式系统的整体性能,因此在嵌入式RTOS的
    的头像 发表于 08-12 09:03 2142次阅读
    嵌入式RTOS的<b class='flag-5'>内存</b><b class='flag-5'>管理机制</b>的实现方案和进行改善设计

    浅析物理内存与虚拟内存的关系及其管理机制

    本文主要介绍内存管理机制:物理内存与虚拟内存的关系,Linux内存管理机制,Python
    的头像 发表于 04-12 09:55 4574次阅读
    浅析物理<b class='flag-5'>内存</b>与虚拟<b class='flag-5'>内存</b>的关系及其<b class='flag-5'>管理机制</b>

    xenomai系统中的xnheap管理机制

    本文分析的enomai系统中的内存池(xnheap)管理机制
    的头像 发表于 05-25 10:15 1295次阅读