经常使用垃圾回收算法

经常使用垃圾回收算法web

   今天我关于常见的垃圾回收算法来作个总结,咱们最常听到的是Java虚拟机里的垃圾回收机制,其实垃圾回收的概念最早并非Java里首先提出来的,

垃圾回收这个概念很早就已经被提出来了,而且已经在其余语言中获得了应用。算法

      关于垃圾回收的机制,这里再也不解释,这篇文章我主要介绍常见的垃圾回收算法,固然还有其余的。spa

算法一:引用计数法。对象

            这个方法是最经典点的一种方法。具体是对于对象设置一个引用计数器,每增长一个变量对它的引用,引用计数器就会加1,没减小一个变量的引用,blog

            引用计数器就会减1,只有当对象的引用计数器变成0时,该对象才会被回收。可见这个算法很简单,可是简单每每会存在不少问题,这里我列举最明显的两个问题,生命周期

            一是采用这种方法后,每次在增长变量引用和减小引用时都要进行加法或减法操做,若是频繁操做对象的话,在必定程度上增长的系统的消耗。内存

            二是这种方法没法处理循环引用的状况。再解释下什么是循环引用,假设有两个对象 A和B,A中引用了B对象,而且B中也引用了A对象,虚拟机

                     那么这时两个对象的引用计数器都不为0,可是因为存在相互引用致使没法垃圾回收A和 B,致使内存泄漏。class

算法二:标记清除法。效率

            这个方法是将垃圾回收分红了两个阶段:标记阶段和清除阶段。

            在标记阶段,经过跟对象,标记全部从跟节点开始的可达的对象,那么未标记的对象就是未被引用的垃圾对象。

            在清除阶段,清除掉全部的未被标记的对象。

            这个方法的缺点是,垃圾回收后可能存在大量的磁盘碎片,准确的说是内存碎片。由于对象所占用的地址空间是固定的。对于这个算法还有改进的算法,就是我后面要说的算法三。

算法三:标记压缩清除法(Java中老年代采用)。

            在算法二的基础上作了一个改进,能够说这个算法分为三个阶段:标记阶段,压缩阶段,清除阶段。标记阶段和清除阶段不变,只不过增长了一个压缩阶段,就是在作完标记阶段后,

            将这些标记过的对象集中放到一块儿,肯定开始和结束地址,好比所有放到开始处,这样再去清除,将不会产生磁盘碎片。可是咱们也要注意到几个问题,压缩阶段占用了系统的消耗,

            而且若是标记对象过多的话,损耗可能会很大,在标记对象相对较少的时候,效率较高。

算法四:复制算法(Java中新生代采用)。

           核心思想是将内存空间分红两块,同一时刻只使用其中的一块,在垃圾回收时将正在使用的内存中的存活的对象复制到未使用的内存中,而后清除正在使用的内存块中全部的对象,

           而后把未使用的内存块变成正在使用的内存块,把原来使用的内存块变成未使用的内存块。很明显若是存活对象较多的话,算法效率会比较差,而且这样会使内存的空间折半,可是这种方法也不会产生内存碎片。

算法五:分代法(Java堆采用)。

          主要思想是根据对象的生命周期长短特色将其进行分块,根据每块内存区间的特色,使用不一样的回收算法,从而提升垃圾回收的效率。

          好比Java虚拟机中的堆就采用了这种方法分红了新生代和老年代。而后对于不一样的代采用不一样的垃圾回收算法。

          新生代使用了复制算法,老年代使用了标记压缩清除算法。

算法六:分区算法。

           这种方法将整个空间划分红连续的不一样的小区间,每一个区间都独立使用,独立回收,好处是能够控制一次回收多少个小区间。

 

 总结:各类回收算法都有各自的优缺点,没有一种算法能够彻底替代其余的算法,在具体的使用中应该结合具体的环境来选择。

相关文章
相关标签/搜索