android性能优化和内存优化 android弱引用有哪些


android性能优化和内存优化 android弱引用有哪些


1、Android内存管理机制1.1 Java内存分配模型先上一张JVM将内存划分区域的图
程序计数器:存储当前线程执行目标方法执行到第几行 。
栈内存:Java栈中存放的是一个个栈帧 , 每个栈帧对应一个被调用的方法 。栈帧包括局部标量表 ,
操作数栈 。
本地方法栈:本地方法栈主要是为执行本地方法服务的 。而Java栈是为执行Java方法服务的 。
方法区:该区域被线程共享 。主要存储每个类的信息(类名 , 方法信息 , 字段信息等)、静态变量 , 常量 , 以及编译器编译后的代码等 。
堆:Java中的堆是被线程共享的 , 且JVM中只有一个堆内存 , 主要存储对象本身及数组
1.2 Dalvik和ART介绍Dalvik:Dalvik是Google公司自己设计用于Android平台的Java虚拟机 。它可以支持已转换为.dex格式的Java应用程序的运行 , .dex格式是专门为Dalvik应用设计的一种压缩格式 , 适合内存和处理器速度有限的系统 , Dalvik经过优化 , 允许在有限的内存中同时运行多个虚拟机实例 , 并且每一个Dalvik应用做为独立的Linux进程执行 , 独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭 。
ART:ART表示Android Runtime , Dalvik是依靠一个just-In -Time编译器去解释字节码 , 运行时编译后的应用都需要通过一个解释器在用户的设备上运行 , 这一机制并不是特别高效 , 但是能让应用更容易在不同的硬件和架构上运行 。ART则是完全改变了这种做法 , 在安装应用的时候就预编译字节码到机器语言 , 这一机制叫预编译 。在移除解释代码这一过程 , 应用程序执行将更有效率 , 启动速度更快 。
ART优点:
1.系统性能更高
2.应用启动速度 , 运行更快 , 体验更好 , 触感反馈更加及时 。
3.更长的电池续航能力
4.支持更低的硬件
ART缺点:
1.储存空间占用更大 。
2.应用安装时间更长 。
Dalvik与ART区别
1.Dalvik每次都要编译在运行 , art只会安装时启动编译
2.art占用的空间比Dalvik要大 , 就是用空间换时间
3.art减少编译 , 减少CPU使用频率 , 使用明显改善电池续航
4.art启动 , 运行更快 , 体验更好 , 触感反馈更及时 。
1.3 为什么要进行内存优化1.减少oom,提高应用的稳定性
2.减少卡顿 , 体验更好
3.减少内存占用 , 应用存活率更高
4.提前处理掉一些异常的隐患
2、Java内存回收算法2.1判断Java中对象是否存活的算法2.1.1 引用计数算法堆内存的每个对象都有一个引用计数器 , 当对象被引用的时候 , 计数器 1 , 当引用失效时计数器-1 , 当计数器的值为0时 , 说明该对象没有被引用 , 就会被认为是垃圾对象 , 系统将会将其回收内存重新分配 。
优点:引用计数器执行简单 , 判定效率高 。
缺点:对于循环引用的对象难以判断出来 , 同时引用计数器增加了程序执行的开销 , 在jdk1.1后 , 就不在使用了 。
2.1.1 根搜索法GC Roots的对象做为起点 , 然后向下搜索 , 搜索所走过的路径称为引用链 , 当一个对象到GC Roots没有任何引用链相连时 , 则该对象不可达 , 也就是说该对象为为垃圾对象 , 可以被回收 。
在Java中 , 可以做为GC Roots的对象包括一下四种:
1.虚拟机栈中引用的对象
2.方法区中的类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JNI的引用对象
2.2 JVM垃圾回收算法2.2.1 标记清除法最基础的垃圾收集算法 , 算法分为标记和清除两个阶段:首先标记出所有需要回收的对象 , 在标记完成之后统一回收掉所有被标记的对象 。

推荐阅读