面试记录第十七节——(内存管理机制概述)

来源:互联网 发布:淘宝基金怎么赎回 编辑:程序博客网 时间:2024/06/10 01:52

一、内存管理机制概述

答:从操作系统的角度来说,内存就是一块数据存储区域,而且他是可以被操作系统调动的资源,在现在的多进程操作系统当中,内存管理十分重要。操作系统它会为每一个进程合理分配内存资源,这里我们来从两个角度来分析,什么是内存管理机制。

  • 1、分配机制

操作系统它会为每一个进程分配一个合理的大小,从而他能保证每一个进程能够正常的运行。而不至于内存不够使用或者某个进程占用太多的内存,这就是操作系统里面的分配概念。

  • 2、回收机制(这一块是操作系统特别重要的一块)

在系统内存不足的时候,他会有一个回收再分配内存资源的机制,从而能够保证新的进程能够正常运行。而回收的时候就要杀死那些占有内存的进程,所以操作系统需要提供一套合理的杀死这些进程的机制,从而把副作用将到最低,而对于我们安卓系统来说,它对内存管理也有一套特别的办法,它和PC端是不一样的。我们都知道安卓它是移动操作系统,一般情况下安卓的内存资源会比PC端更少,所以我们就要更加谨慎的管理内存。


二、Android内存管理机制

答:

  • 1、分配机制

我们知道,安卓在为每一个进程分配内存的时候,它采用了一个弹性的分配方式,比如刚开始他不会为一个新的APP分配太多的内存空间,而是给每一个app进程分配一个小额的内存量,而这个量是根据每一个移动端设备物理尺寸大小所决定,随着你的APP不断的运行,你可能发现当前内存已经不够使用了,这个时候安卓就会为每一个进程分配额外的大小,但是我们需要注意的是,分配的额外的内存大小不是随意去分配的,他是有限度的。因为我们都知道,安卓的内存大小是有限制的,所以说系统不可能为每一个APP进程分配无限大的内存.

总结:安卓的分配机制它的最大限度就是让更多的进程存活在内存当中,当用户下次再次启动时,他就不需要重新创建进程,他只需要恢复已有的进程即可,这样就减少了应用启动的时候,提高用户体验。

  • 回收机制(复杂的一块)

安卓对内存的使用,他的宗旨是尽最大限度的使用。它是继承linux的特点,安卓系统他会在内存中保存尽可能多的数据。这里也有一个缺点,比如说有的进程不再被使用,但是数据还保存在内存当中,所以现在安卓不推荐直接退出应用。如果这样当用户下次启动应用的时候,只需要回复当前进程即可,而不需要创建新进程。当安卓发现内存不够使用,开始回收内存的时候,安卓就会杀死其他进程。来回收足够的内存,从而开启新的进程。这里注意,对于进程分配他有一个优先级的概念,

  • 优先级它主要分为五个阶段。

第一:前台进程,屏幕当中显示的进程

第二:可见进程,他已经不属于前台进程,用户仍能看见的进程,

第三:服务进程,例如定位、闹钟等。

第四:后台进程,后台进程不同于服务进程,它是在后台处理一些计算的进程.

第五:空进程,没有任何东西在内存运行的进程。内存可以随时回收。


三、安卓中为什么会有这五个分级

答:因为优先级越低的进程,被内存回收的概率越大

1、例如前台进程、可见进程、服务进程:一般情况下是不会被杀死的,

2、后台进程:他会存放在一个缓存的列表中,就是lru(最进最少使用的)缓存机制,先杀死的进程他会处于这个列表的尾部(也就是最进最少使用的后台进程会被第一个杀死)。

3、空进程:他是为了平衡整个系统的性能,安卓是不会保存这些进程的,


四、回收效率概念是什么

答:当安卓开始杀死进程的时候,系统会判断每一个杀死后所带来的回收效益,因为安卓更喜欢杀死一个能够回收更多内存的进程,在这里我们就知道,可以杀死更多的进程,来获取更多的内存。当然我们还是希望能够杀死少的进程,这样对用户的体验影响越小。


五、遵循内存管理机制的目标

答:我们在开发项目的时候,都会给APP顶订一个内存目标,这目标有以下几点:

1、更少的占用内存:我们都知道,如果一个APP性能更好,站用户手机的内存越少,这样对用户的体验,都是一个很好的目标。

2、在合适的时候,合理的释放系统资源。(并不是你不要的马上就要回收,如果频繁的释放对象,会造成内存抖动,而内存抖动会造成很多不好的现象,比如UI卡顿、anr、甚至是oom)

3、在系统内存紧张的时候,能释放掉大部分不重要的资源,来为Android系统提供可用的内存。

4、能够很合理的在特殊生命周期中,保存或者还原重要数据,以至于系统能够正确的重新回复应用


六、内存优化方法。

答:我们在开发项目的时候,都会给APP顶订一个内存目标,这目标有以下几点:

1、当service完成任务,尽量停止它。我们知道service进程优先级是比较低的,他的优先级叫做服务进程。所以这会影响到它的内存回收,这里我们可以用IntentService替换Service完成所需要的任务。

好处有两点:
第一点:我们知道IntentService是继承Service,他也是一个服务,但是他不同Service的地方,Service是默认在主线程,所以Service不可以做耗时操作,IntentService是内部开启一个子线程,所以在他的onHandleIntent方法中,可以做一些耗时操作。

第二点:IntentService执行完之后他会自动停止,而Service必须手动调用才能停止,如果Service没有退出就会造成内存的泄露。

2、在UI不可见的时候,释放掉一些只有UI使用的资源

3、在系统内存紧张的时候,尽可能多的释放掉一些非重要的资源。

4、避免滥用Bitmap导致资源浪费。(根据当前分辨率压缩Bitmap是最好的选择,只用后要调用recycle方法释放掉Bitmap在C内存中的内存,也可以使用软引用引用一个Bitmap,然后使用lru缓存,来对Bitmap进行缓存算法)

5、使用针对内存优化过的数据容器,少用枚举常量,它消耗的内存是普通常量的两倍多

6、避免使用依赖注入框架。:例如我们项目开发过程中,会使用很多的注入框架,例如ButterKnife。使用这些依赖框架有好的地方,但是也会给我们带来额外的服务。

7、使用多进程,例如定位、推送、WebView就可以写一个后台进程来执行。特别是Webview如果不开启一个进程的话就会造成内存泄露。

阅读全文
0 0
原创粉丝点击