美文网首页Android内存专题
Android内存优化1-内存原理

Android内存优化1-内存原理

作者: 棒槌爸爸 | 来源:发表于2018-07-28 17:28 被阅读0次

    要优化内存,先要弄懂android内存体系。

    image.png

    计算器:这是线程私有的, 标记线程执行到哪儿了。不会抛出异常

    虚拟机栈:线程私有,栈帧用来存放局部变量表 操作数栈 方法出口等。

    局部变量表存放了编译器已知的基本数据类型, 对象引用

    本地方法栈:主要是native方法执行需要用到的栈

    方法区:类信息、常量、静态变量,运行时常量池

    运行时常量池记录了编译器的各种字面量和符号引用。

    堆: Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,是虚拟机所管理的内存中最大的一块。此内存区域的唯一目的就是【存放对象实例和数组】,几乎所有的对象实例和数组都在这里分配内存。

    栈内存的回收:
    栈也会内存溢出的,例如你写个递归。java栈内存的内存回收就是利用方法和栈的特性来做的。

    基础类型变量仅方法内的局部变量保存在栈内存中,成员变量保存在堆中。

    堆内存的回收:
    Java的垃圾回收机制GC,GC仅运行在堆内存上,开始学习GC之前你应该知道一个词:stop-the-world。

    GC有多种回收算法,但不管哪种回收算法,在GC回收时除了gc所需要的线程外,其他线程都会挂起直到GC结束,GC调优通常就是为了改善stop-the-wrold的时间。

    Android Dalvik Heap与原生Java一样,将堆的内存空间分为三个区域,
    Young Generation,Old Generation, Permanent Generation。

    AQOUYULE~BL0BO0%6OLJA74.png
    • 最近分配的对象会存放在Young Generation区域,当这个对象经过数次GC后依然存活,它会被移动到Old Generation,最后累积一定时间再移动到Permanent Generation区域。系统会根据内存中不同的内存数据类型分别执行不同的gc操作。
    • 图中的permanent generation称为方法区,其中存储着类和接口的元信息以及interned的字符串信息。所以这一区域并不是为老年代中存活下来的对象所定义的持久区。方法区中也会发生GC,这里的GC同样也被称为major GC

    很多手机厂商号称的无卡顿安卓,无非就是利用一些比较成熟的基于统计,机器学习的算法定时清理数据,清理内存,甚至提前加载数据到内存。

    相关文章

      网友评论

        本文标题:Android内存优化1-内存原理

        本文链接:https://www.haomeiwen.com/subject/sjoomftx.html