Android 内存管理详解

本文详细探讨了Android的内存管理,包括垃圾回收机制的目标、内存分配策略、共享内存的实现方式,以及APP内存的申请与回收。介绍了Android如何通过垃圾回收优化性能,以及如何在不同进程间共享内存以适应RAM需求。同时,阐述了APP内存限制,帮助开发者理解和应对内存限制问题。

垃圾回收机制的目的:

1.在程序中查找将来不再使用的数据对象(Object)

2.回收这些对象所占用的内存资源。

Android 内存是一个典型的堆内存(Heap),这意味着系统会根据被分配的对象的预期寿命和大小有不同的分配桶。

例如,最近分配的对象属于年轻一代。当一个对象保持足够的活动时间时,它可以被提升到一个老一代,然后是一个永久的时代。

每个堆的生成都有自己占用内存的上限。任何时候一旦内存即将被填满,系统就会执行一个垃圾回收事件去试图释放内存。垃圾收集的持续时间取决于它正在回收的那个对象以及回收多少个正在活跃的对象。

尽管垃圾器回收的速度相当快,但它仍然可能会影响应用程序的性能。并且你一般不会控制垃圾器回收你代码事件的时间。

系统垃圾回收机制具有一定运行中的标准,这个标准主要用于确定何时执行垃圾收集。当条件满足时,系统停止执行进程并开始垃圾收集。

如果垃圾回收发生在密集的处理循环(如动画)或音乐播放期间,可能会增加处理时间。这种增长可能会推动您的应用程序执行代码超过推荐的16ms阈值,以实现高效流畅的帧渲染。

此外,您的代码流可能会执行各种强制垃圾收集事件的工作,或使其持续时间超过正常。例如,如果在alpha混合动画的每个帧期间在for循环的最内部分配了多个对象,则可能会占用大量的内存堆,并使用大量对象。在这种情况下,垃圾收集器将执行多个垃圾收集事件,并可能降低应用程序的性能。

有关垃圾收集的更多一般信息,请参阅垃圾收集。

二、共享内存

======

为了适应不同的RAM需求,Android 尝试在不同进程之间共享内存,共享内存的方法如下:

1. APP共享Framework框架代码以及资源


每个APP的进程都是从Zygote进程中分离出来的。

Zygote 进程:

Zygote进程是在系统启动并加载Framwork框架代码和资源(如Activity Theme)时开始。要启动一个新的应用程序进程,系统会从Zygote进程fork分离出来,然后在新进程中加载并运行应用程序的代码。这种方法允许大部分分配给Framework框架代码和资源的RAM页面与所有应用程序进程之间共享。

2. 大多数静态数据可以跨进程共享


大多数静态数据被映射到一个进程。这种技术允许数据在进程之间共享,并允许在需要时将其分页。示例静态数据包括:Dalvik代码(通过将其放置在用于直接映射的预链接.odex文件中),应用程序资源(通过将资源表设计为可以被映射的结构以及通过对齐APK的zip条目) 以及.so文件中的本地代码等传统项目元素。

3. Android使用显式分配的共享内存区域(使用ashmem或gralloc)共享同一个动态RAM。


例如,窗口表面使用应用程序和屏幕合成器之间的共享内存,游标缓冲区使用内容提供者和客户端之间的共享内存。

由于共享内存的广泛使用,确定您的应用使用多少内存需要谨慎。在调查您的RAM使用情况中讨论了正确确定应用程序内存使用情况的技巧。如需获取更多内容,请看RAM使用情况分析详解。

三、APP内存的申请与回收

=============

Dalvik 虚拟机会限制每个应用程序进程的虚拟内存范围。它定义了逻辑堆的大小,并且可以根据需要增长,但只能达到系统为每个应用程序定义的限制。

堆的逻辑大小与堆使用的物理内存量不同。在检查应用程序的堆时,Android 会计算一个名为“比例集合大小** Proportion Set Size ”(PSS)** 的值,该值与其他进程共享的脏页面(Page)和干净页面(Page),并且数量与多少应用程序共享该RAM成正比。(PSS)总数是系统认为是您的物理内存的足迹。有关PSS的更多信息,请参阅RAM使用情况指南

Dalvik堆不压缩堆的逻辑大小,这意味着 Android不会整理堆以关闭空间。当堆的末尾有未使用的空间时,Android只能缩小逻辑堆的大小。然而,系统仍然可以减少堆使用的物理内存。在垃圾收集之后,Dalvik遍历堆并找到未使用的页面,然后使用madvise将这些页面返回给内核。

因此,成对的大块分配和释放应该会导致所有(或几乎全部)所使用的物理内存的回收。但是,从小分配中回收内存的效率可能会低得多,因为用于小分配的页面仍可能与尚未释放的其他内容共享。

四、APP内存限制

=========

为了维护一个主要的多功能环境,Android 对每个应用程序的堆大小设定了一个硬限制。确切的堆大小限制根据设备有多少RAM可用而有所不同。如果您的应用程序已达到堆容量并尝试分配更多内存,则可能会收到OutOfMemoryError

在某些情况下,您可能需要查询系统以确定在当前设备上有多少堆空间可用 。

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

获取](https://bbs.csdn.net/topics/618156601)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值