Android内存回收机制相关知识点整理

1,java内存使用划分

堆内存(Heap Memory): 存放Java对象 非堆内存(Non-Heap Memory): 存放类加载信息和其它meta-data 其它(Other): 存放JVM 自身代码等。内存回收(GC)主要处理的是堆内存。

2,堆内存模型

堆内存分为两大部分:新生代和老年代。比例为1:2。新生代又分为三个部分:一个Eden区和两个Survivor区,比例为8:1:1。 Eden区存放新生的对象。 Survivor存放每次垃圾回收后存活的对象。

3,垃圾判断算法

引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

可达性分析算法(根搜索算法)

从GC Roots(每种具体实现对GC Roots有不同的定义)作为起点,向下搜索它们引用的对象,可以生成一棵引用树,树的节点视为可达对象,反之视为不可达。
该算法可以解决循环引用问题。因为即使在循环引用状态下,根节点是无法找到这些节点的。

4,垃圾回收相关概念

Stop The World

Android执行垃圾回收算法时需要Stop The World(STW)。当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成。

GC执行时机

新生代的伊甸园空间(Eden)不够存放新对象的时候,执行 Minro GC 。
升到老年代的对象大于老年代剩余空间的时候(或者小于的时候被 HandlePromotionFailure 参数强制)执行 Full GC 。

5,垃圾回收算法

标注清理回收(Mark and Sweep GC)

从GC Roots开始,将内存整个遍历一次,保留所有可以被GC Roots直接或间接引用到的对象,剩下的对象当作垃圾进行回收。

拷贝回收(Copying GC)

为了解决Mark-Sweep算法内存碎片化的缺陷而被提出的算法。将内存等分,每次只是用其中的一块。当这一块内存满后将尚存活的对象复制到另一块上去,然后把整块内存的数据清除。

标注整理回收(Mark and COMPACT GC)

结合了以上两个算法,为了避免缺陷而提出。标记阶段和Mark-Sweep算法相同,标记后不是清理对象,而是将存活对象移向内存的一端,然后清除端边界外的对象。


逐代回收法(Generational GC)

标注法最大的问题就是中断的时间过长,此算法是对标注法的优化基于下面几个发现:
大部分对象创建完很快就没用了 – 即变成垃圾;
每次GC收集的90%的对象都是上次GC后创建的;
如果对象可以活过一个GC周期,那么它在后续几次GC中变成垃圾的几率很小,因此每次在GC过程中反复标注和处理它是浪费时间。

老年态内存不满时,只对新生代进行GC,当老年态内存满时再对老年态内存GC。

Android内存回收算法

Delvik

实现了标注与清理(Mark and Sweep)和拷贝GC,但是具体使用什么算法是在编译期决定的,无法在运行的时候动态更换。关于Android ART 垃圾回收机制,将在下篇文章详聊。

ART

ART运行时与Dalvik虚拟机一样,都使用了Mark-Sweep算法进行垃圾回收,因此它们的垃圾回收流程在总体上是一致的。但是ART运行时对堆的划分更加细致,因而在此基础上实现了更多样的回收策略。
两种可能会触发GC的情况。第一种情况是没有足够内存分配请求的分存时,会调用Heap类的成员函数CollectGarbageInternal触发一个原因为kGcCauseForAlloc的GC。第二种情况下分配出请求的内存之后,堆剩下的内存超过一定的阀值,就会调用Heap类的成员函数RequestConcurrentGC请求执行一个并行GC。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 参考网址:http://www.blogjava.net/ldwblog/archive/2013/07/24/4...
    felix_feng阅读 4,158评论 0 2
  • 1 如何确定某个对象是“垃圾”? 1 既然垃圾收集器的任务是回收垃圾对象所占的空间后,再次供新的对象使用,那么垃圾...
    paulpaullong阅读 3,335评论 0 2
  • 内存区域划分,从高地址到低地址依次是 栈区:内存由系统控制开辟、释放。当系统的栈区大小不够分配时, 系统会提示栈溢...
    梵生阅读 3,885评论 0 0
  • 1、范围:要回收哪些区域 在JVM五种内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。...
    冰河winner阅读 3,576评论 0 2
  • 1.GC基本概念 在java中,程序员是不需要显式的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中有一个...
    hadoop_a9bb阅读 2,738评论 0 0

友情链接更多精彩内容