GC(垃圾回收器)中的算法

  • GC的两种判定方法

         (1) 引用计数法

              给对象添加一个引用计数器,每当引用一次+1,每次失效时-1,当计数器为0时,表示对象就是不可能再被使用的。

         (2) 可达性分析算法

              将“GC Roots”对象作为根节点,开始向下搜索,所走过的路径成为引用链。当一个对象到GC Roots没有任何引用链时,说明此对象是不可用的。

 

  • 能作为GC Roots的对象

         (1) 虚拟机栈中引用的对象

         (2) 方法区中静态属性引用的对象

         (3) 方法区中常量引用的对象

         (4) 本地方法栈中JNI引用的对象

 

  • GC的收集方法

         (1) 标记清除算法

              过程: * 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的视为垃圾对象

                       * 清除阶段:清除所有未被标记的对象

              缺点: * 效率问题,标记和清除两个过程的效率都不高

                        * 空间问题,会产生大量不连续的内存碎片

         (2) 复制算法

              过程: * 将原有的内存空间分成两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中存活对对象复制到未使用的内存块中,然后清除正在使用的内存块中所有对象

              缺点: * 浪费一半的内存

                        * 如果对象的存活率很高,复制要花很长时间

         (3) 标记整理算法

               过程: * 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的视为垃圾对象

                        * 整理阶段:将所有的存活对象压缩到内存的一端(或向另一端移动),之后清理边界所有的空间

               缺点: * 效率也不高,不仅要标记存活对象,还要整理它们的引用地址

posted on 2017-03-18 09:02  一个不会coding的girl  阅读(185)  评论(0编辑  收藏  举报

导航