Android应用开发那些事

Android | App内存优化 之 JVM & Androi

2019-11-22  本文已影响0人  凌川江雪

Java内存分配

图自慕课网
方法区:



  • 每个线程包含一个栈区
    栈中只保存基础数据类型对象以及基础数据引用
    (Java语言提供了八种基本数据类型
    六种数字类型(四个整数型long、int、short、byte,两个浮点型float、double),
    一种字符类型String,还有一种布尔型

  • 每个栈中的数据(基础数据类型对象引用)都是私有的,
    其他栈不能访问。

  • 栈分为3个部分:
    基本类型变量区执行环境上下文操作指令区(存放操作指令)。


虚拟机栈

局部变量表存放了编译期可知的
各种基本数据类型对象引用类型returnAddress类型
它所需的内存空间在编译期间完成分配


本地方法栈



在Java堆中,
可能划分出多个线程私有分配缓冲区(Thread Local Allocation Buffer,TLAB),
但无论哪个区域,存储的都仍然是对象实例
进一步划分的目的是
为了更好地回收内存
或者更快地分配内存


程序计数器(Program Counter Register)

**注意:!!!!!!!

计数器的值代表着下一条需要执行的字节码指令,!!!
字节码解释器工作时,
就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,!!!!
分支、循环、跳转、异常处理、线程恢复基础功能
都需要依赖这个计数器来完成。**



JVM垃圾回收算法

  • 回收算法有以下四种

    • 分代收集算法(1):是当前商业虚拟机都采用的一种算法,根据对象存活周期的不同,将Java堆划分为新生代和老年代,并根据各个年代的特点采用最适当的收集算法。
      • 新生代:大批对象死去,只有少量存活。使用『复制算法』,只需复制少量存活对象即可。

        • 复制算法(2):把可用内存按容量划分为大小相等的两块,每次只使用其中的一块。
          当这一块的内存用尽后,把还存活着的对象『复制』到另外一块上面,
          再将这一块内存空间一次清理掉。
      • 老年代:对象存活率高。使用『标记—清理算法』或者『标记—整理算法』,只需标记较少的回收对象即可。

        • 标记-清除算法(3):首先『标记』出所有需要回收的对象,然后统一『清除』所有被标记的
        • 标记-整理算法(4):首先『标记』出所有需要回收的对象,然后进行『整理』,使得存活的对象都向一端移动,最后直接清理掉端边界以外的内存。



Android内存管理机制

内存(按需)弹性分配

分配值最大值受具体设备影响;
不同配置的手机,其单个APP可以使用的内存是不同的;

比如多者有单个APP可以使用512M的内存的,少者128M甚至更甚;


OOM场景:

OOM有时候是APP自己的原因,有时候也可能是整个系统的原因;


Dalvik 和 ART的区别(关注点:程序运行时、GC算法)

参考链接:

Android 4.4之前,Android系统一直都是在Dalvik 虚拟机上的,
从Android 4.4开始开始引入ART,到5.0已经成为默认选择。

  • ART,Android Runtime 的简称。

  • 优点:

    • 通过在安装应用程序时,自动对程序进行代码预读取编译,
      让程序直接编译成机器语言,运行时直接运行 无需再做转化,!!!!
      免去了Dalvik模式运行时要时时转换代码,
    • 实现高效率、省电、占用更低的系统内存、手机运行流畅。
  • 缺点:

    • 占用略高一些的存储空间;
    • 安装程序时要相比普通 Dalvik 模式要长一些时间来实现预编译;


Low Memory Killer 机制

机制目的:保证大多数情况下,不会出现内存不足的情境;

如果用户按Home键返回桌面,那么该app成为Background进程;
如果按Back返回,则成为Empty进程。





参考自
上一篇 下一篇

猜你喜欢

热点阅读