GC垃圾回收机制及算法

垃圾回收机制简介

   垃圾回收的全称是 Garbage Collection 通常被简称为GC。是对内存中堆区域进行清理的一种技术。

 

为什么需要垃圾回收机制

  1、内存溢出。

     2、程序效率降低。

 

如何知道一个对象是否可以被回收

  1、 引用计数算法:判断对象的引用数量。

    原理就是为每个对象创建一个引用计数,当有对象引用时,计数器加1,当引用释放时,计数器减1,所以,当计数器为0时,就认为可以被回收。

    

 

     缺点:很难解决对象之间互相循环引用的问题。

  2、 可达性分析算法:判断对象的引用链是否可达。  

    可达性分析从GC Roots(根)开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链时,则认为此对象可以被回收。大家可以认为就是一个树的根节点开始计算引用情况。 

 

垃圾收集算法

   1、 标记-清除算法(Mark-Sweep GC)

    标记-清除算法分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。标记-清除算法也是最基础的垃圾回收算法

          

          从上图中我们就可以发现,该算法最大的问题是内存碎片化严重,后续可能发生大对象不能找到可利用空间的问题。

   2、 复制算法(Copying)

    为了解决标记-清除算法算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉 。

    

    这种算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原本的一半。且存活对象增多的话, Copying 算法的效率会大大降低。

   3、 标记-整理算法(Mark-Compact) 

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

    

 

   4.、分代收集算法  

       分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内存划分为不同的域,一般情况下将 GC 堆划分 为老生代(Tenured/Old Generation)和新生代(YoungGeneration)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特 点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。

 

 

posted @ 2019-07-04 16:53  songguojun  阅读(703)  评论(0编辑  收藏  举报