zoukankan      html  css  js  c++  java
  • 垃圾回收的常见算法

    1.引用计数法

      原理:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了, 可以被回收。

      优点:实时性较高,无需等到内存不够的时候,才开始回收,运行时根据对象的计数器是否 为0,就可以直接回收;在垃圾回收过程中,应用无需挂起。如果申请内存时,内存不足,则立刻报 outofmember 错误;区域性,更新对象的计数器时,只是影响到该对象,不会扫描全部对象。

      缺点:每次对象被引用时,都需要去更新计数器,有一点时间开销;浪费CPU资源,即使内存够用,仍然在运行时进行计数器的统计;无法解决循环引用问题。(最大的缺点)

    2.标记清除法

      原理:标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。标记:从根节点开始标记引用的对象;清除:未被标记引用的对象就是垃圾对象,可以被清理。

      优点:解决了引用计数算法中的循环引用的问题,没有从root节点引 用的对象都会被回收

      缺点:效率较低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应用程序,对于交互性要求比较高的应用而言这个体验是非常差的;通过标记清除算法清理出来的内存,碎片化较为严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来的内存是不连贯的。

    3.标记压缩法

      原理:标记压缩算法是在标记清除算法的基础之上,做了优化改进的算法。和标记清除算法一 样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的清理未标记的对象,而是将存活的对象压缩到内存的一端,然后清理边界以外的垃圾,从而解决了碎片化的问题。

    4.复制算法

      原理:复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收 时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内 存的角色,完成垃圾的回收。如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且 效率比较高,反之,则不适合。

      优点:在垃圾对象多的情况下,效率较高;清理后,内存无碎片

      缺点:在垃圾对象少的情况下,不适用,如:老年代内存;分配的2块内存空间,在同一个时刻,只能使用一半,内存使用率较低

    5.分代算法

      根据回收对象的特点进行选择,在jvm中,年轻代适合使用复制算法,老年代适合使用标记清除或标记压缩算法。

  • 相关阅读:
    斜率dp+cdq分治
    踢罐子 [几何+乱搞]
    [HDU3710] Battle Over Cities [树链剖分+线段树+并查集+kruskal+思维]
    [xsy1129] flow [树链剖分和线段树一起优化网络流][我也不知道这是什么鬼标签]
    [CF666E] Forensic Examination [广义后缀自动机+线段树合并]
    省选算法学习-BSGS与exBSGS与二次剩余
    省选算法学习-回文自动机 && 回文树
    省选算法学习-后缀数组+后缀自动机+后缀树
    Password [分块]
    随机过程——泊松过程
  • 原文地址:https://www.cnblogs.com/Life-is-Demo/p/13633185.html
Copyright © 2011-2022 走看看