首页 > 技术文章 > Android内存管理机制

baizhou168 2021-01-17 02:23 原文

1. java内存管理机制

  1.1 java内存分配

    方法区

    虚拟机栈

    本地方法栈

    堆

    程序计数器

  1.2 java内存回收算法 

    1.2.1标记-清除算法 

      标记出所有需要回收的对象 

      统一回收所有被标记的对象 

      

 

    缺点:

 

        标记-和清除效率不高

      会产生大量不连续的内存碎片,出现内存空洞

 

    1.2.1复制算法    

      将内存划分为大小相等的两块内存

      一块内存用完之后复制存活对象到另一块

        清理另一块内存

      

 

      优缺点:

        实现简单,运行高效(相对前一种来说)

 

         浪费一半空间,代价大

 

      1.2.2 标记-整理算法 

        标记过程与“标记-清除”算法 一样

        存活对象往一端进行移动 

        清理其余内存

        

 

 

         优缺点:

          避免标记-清理导致的内存碎片

          避免复制算法 的空间浪费

 

      1.2.3 分代收集算法 

        结合多种收集算法 优势 

        新生代对象存活率低,用复制算法 

        老年代对象存活率高,用 标记-整理算法 

 

2.Android内存管理机制

  内存弹性分配,分配值与最大值受具体设备影响 

  OOM场景:内存真正不足、可用内存不足

  Dalvik 与 Art区别

    Dalvik 固定一种回收算法 

    Art回收算法可运行期选择

    Art具备内存整理能力,减少内存空洞

  Low Memory Killer

    进程分类:    

      前台进程(foreground process):需要用户当前正在进行的操作。一般满足以下条件:
        1. 屏幕顶层运行Activity(处于onResume()状态),用户正与之交互
        2. 有BroadcastReceiver正在执行代码
        3. 有Service在其回调方法(onCreate()、onStart()、onDestroy())中正在执行代码

        这种进程较少,一般来作为最后的手段来回收内存

      可视进程(visible process):做用户当前意识到的工作。一般满足以下条件:
        1. 屏幕上显示Activity,但不可操作(处于onPause()状态)
        2. 有service通过调用Service.startForeground(),作为一个前台服务运行
        3. 含有用户意识到的特定的服务,如动态壁纸、输入法等

        这些进程很重要,一般不会杀死,除非这样做可以使得所有前台进程存活。

      服务进程(service process):含有以startService()方法启动的service。虽然该进程用户不直接可见,但是它们

      一般做一些用户关注的事情(如数据的上传与下载)。
        这些进程一般不会杀死,除非系统内存不足以保持前台进程和可视进程的运行。
        对于长时间运行的service(如30分钟以上),系统会考虑将之降级为缓存进程,避免长时间运行导致内存

        漏或其他问题,占用过多RAM以至于系统无法分配充足资源给缓存进程。

      缓存/后台进程(cached/background process):一般来说包含以下条件:
        1. 包含多个Activity实例,但是都不可见(处于onStop()且已返回)。
        系统如有内存需要,可随意杀死。

 

 

推荐阅读