

通过前面一段时间的学习总结及后期要涉及的内容,整理了下逻辑,绘制了Android内存管理及优化的思惟逻辑图,具体以下:web
Android内存管理体系已经讲解了算法
内存管理基础缓存
Android内存管理机制微信
具体相关内容可参考以下连接
网络
接下来内存优化将会从图上的几点来进行分析整理。
内存优化工具介绍
Android常见的内存问题及解决方案
内存优化的体系的建设
内存问题总结及思考
今天从操做系统的角度来闲聊一下代码开发过程当中如何配合系统作内存管理。内存就是一块数据存储区域,是可被操做系统调度的资源。在多任务(进程)的OS中,内存管理尤其重要,OS须要为每个进程合理的分配内存资源。因此能够从OS对内存和回收两方面来理解内存管理机制。
分配机制:为每个任务(进程)分配一个合理大小的内存块,保证每个进程可以正常的运行,同时确保进程不会占用太多的内存。
回收机制:当系统内存不足的时候,须要有一个合理的回收再分配机制,以保证新的进程能够正常运行。回收时杀死那些正在占用内存的进程,OS须要提供一个合理的杀死进程机制。
一样做为一个多任务的操做系统,Android系统对内存管理有有一套本身的方法,手机上的内存资源比PC更少,须要更加谨慎的管理内存。理解Android的内存分配机制有助于咱们写出更高效的代码,提升应用的性能。
下面分别从 分配 和 回收 两方面来描述Android的内存管理机制:
分配机制
Android为每一个进程分配内存时,采用弹性的分配方式,即刚开始并不会给应用分配不少的内存,而是给每个进程分配一个“够用”的内存大小。这个大小值是根据每个设备的实际的物理内存大小来决定的。随着应用的运行和使用,Android会为进程分配一些额外的内存大小。可是分配的大小是有限度的,系统不可能为每个应用分配无限大小的内存。
总之,Android系统须要最大限度的让更多的进程存活在内存中,以保证用户再次打开应用时减小应用的启动时间,提升用户体验。
回收机制
Android对内存的使用方式是“尽最大限度的使用”,只有当内存不足的时候,才会杀死其它进程来回收足够的内存。但Android系统不可能随便的杀死一个进程,它也有一个机制杀死进程来回收内存。
Android杀死进程有两个参考条件:
进程优先级
Android为每个进程分配了优先组的概念,优先组越低的进程,被杀死的几率就越大。根据进程的重要性,划分为5级:
1)前台进程(Foreground process)
用户当前操做所必需的进程。一般在任意给定时间前台进程都为数很少。只有在内存不足以支持它们同时继续运行这一万不得已的状况下,系统才会终止它们。
2)可见进程(Visible process)
没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。可见进程被视为是极其重要的进程,除非为了维持全部前台进程同时运行而必须终止,不然系统不会终止这些进程。
3)服务进程(Service process)
尽管服务进程与用户所见内容没有直接关联,可是它们一般在执行一些用户关心的操做(例如,在后台播放音乐或从网络下载数据)。所以,除非内存不足以维持全部前台进程和可见进程同时运行,不然系统会让服务进程保持运行状态。
4)后台进程(Background process)
后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。一般会有不少后台进程在运行,所以它们会保存在 LRU 列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。若是某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,由于当用户导航回该 Activity 时,Activity 会恢复其全部可见状态。
5)空进程(Empty process)
不含任何活动应用组件的进程。保留这种进程的的惟一目的是用做缓存,以缩短下次在其中运行组件所需的启动时间。为使整体系统资源在进程缓存和底层内核缓存之间保持平衡,系统每每会终止这些进程。
一般,前面三种进程不会被杀死。
回收收益
当Android系统开始杀死LRU缓存中的进程时,系统会判断每一个进程杀死后带来的回收收益。由于Android老是倾向于杀死一个能回收更多内存的进程,从而能够杀死更少的进程,来获取更多的内存。杀死的进程越少,对用户体验的影响就越小。
为何App要符合内存管理机制?
在Android系统中,符合内存管理机制的App,对Android系统和App来讲,是一个共赢的过程。如何每个App都遵循这个规则,那么Android系统会更加流畅,也会带来更好的用户体验,App也能够更长时间的驻留在内存中。
若是真的须要不少内存,能够采用多进程的方式。
如何编写符合Android内存管理机制的App?
一个遵循Android内存管理机制的App应该具备如下几个特色:
1)更少的占用内存;
2)在合适的时候,合理的释放系统资源。
3)在系统内存紧张的状况下,能释放掉大部分不重要的资源,来为Android系统提供可用的内存。
4)可以很合理的在特殊生命周期中,保存或者还原重要数据,以致于系统可以正确的重要恢复该应用。
所以,在开发过程当中要作到:
避免建立没必要要的对象。
在合适的生命周期中,合理的管理资源。
在系统内存不足时,主动释放更多的资源。
开发时,应该如何注意App的内存管理呢?
1)减小内存资源占用
好比,使用StringBuffer,int等更少内存占用的数据结构。
2)内存溢出
主要是Bitmap。解决办法是:减小每一个对象占用的内存,如图片压缩等;申请大内存。
3)内存泄露
内存泄露是指原本该被GC回收后还给系统的内存,并无被GC回收。多数是由于不合理的对象引用形成的。
解决这种问题:一、经过各类内存分析工具,好比MAT,分析运行时的内存映像文件,找出形成内存泄露的代码,并修改。二、适当的使用WeakReference。具体问题解决方案请关注接下来的内容。
夯实基础,关注前沿,娱乐生活
掌握更多前沿技术,获取更多笑点
请关注--------喘口仙氣
本文分享自微信公众号 - 喘口仙氣(gh_db8538619cdd)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。