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


优点:引用计数器执行简单 , 判定效率高 。
缺点:对于循环引用的对象难以判断出来 , 同时引用计数器增加了程序执行的开销 , 在jdk1.1后 , 就不在使用了 。
2.1.1 根搜索法 GC Roots的对象做为起点 , 然后向下搜索 , 搜索所走过的路径称为引用链 , 当一个对象到GC Roots没有任何引用链相连时 , 则该对象不可达 , 也就是说该对象为为垃圾对象 , 可以被回收 。
在Java中 , 可以做为GC Roots的对象包括一下四种:
1.虚拟机栈中引用的对象
2.方法区中的类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JNI的引用对象
2.2 JVM垃圾回收算法 2.2.1 标记清除法 最基础的垃圾收集算法 , 算法分为标记和清除两个阶段:首先标记出所有需要回收的对象 , 在标记完成之后统一回收掉所有被标记的对象 。
缺点:效率低 , 其次会产生大量的不连续的内存碎片 , 导致提前触发另一次垃圾收集动作 。
2.2.2 复制回收算法 复制回收算法是将可用内存按容量分成大小相等的两块 , 每次只使用其中的一块 , 当这块内存使用完了 , 就将存活的对象复制到另一块内存上去 , 然后把使用过的内存空间一次清理掉 , 这样使得每都次都是对其中一块内存进行回收 , 内存分配时不用考虑内存碎片等复杂情况 。
缺点:可使用内存降为原来的一半 。
2.2.3 标记整理法 标记-整理算法在标记-清除算法的基础上做了改进 , 标记阶段将可回收的对象标记出来 , 标记完成后不是直接对可回收的对象进行清理 , 而是让所有存活的对象都向一端移动 , 在移动的过程中清理掉可回收的对象 。
优点:相比于标记清除法来说 , 标记整理法不会大量产生不连续内存碎片问题 。
缺点:如果是在对象存活率较高的情况下会执行较多的复制操作 , 效率将会降低很多 , 而在存活率较低的情况下 , 效率会大大提高 。
2.2.4 分代收集回收算法 当前商业虚拟机都是采用的是分代收集算法 , 根据对象存活的周期不同将内存划分为几块 , 一般是将java堆分为年轻代 , 老年代和永久代 。然后根据各个年代的特点来采取不同收集算法 , 年轻代存活率较低 , 采用复制回收算法 , 老年代对象存活率较高 , 采用标记清除法或者是标记整理法来进行回收 。
3、内存问题表现形式 3.1 内存抖动 内存波动图呈锯齿状 , gc频繁导致卡顿 。
3.2 内存泄漏 内存泄露简单来说就是系统分配出去的内存由于某种原因导致没法释放 , 内存会越来越小 , 最终导致oom 。
3.3 内存溢出 即OOM , OOM时会导致程序异常 。Android设备出厂以后 , java虚拟机对单个应用的最大内存分配就确定下来了 , 超出这个值就会OOM 。

猜你喜欢