• 垃圾回收算法的前世今生(转)


    1.引用计数法(java未采用)

    2.标记-清除算发(jvm老年回收)

    3.标记-压缩算发(jvm老年回收)

    4.复制算法(jvm新生代回收)

    标记-清除算法

    标记-清扫式垃圾回收器是一种直接的全面停顿算法。简单的说,它们找出所有不可达的对象,并将它们放入空闲列表Free。

    清扫过程将分为标记阶段和清扫阶段

    缺点:需要扫描整个堆区,时间开销较大。

    标记压缩算法:

    ①标记阶段,通过根节点标记所有可达(直接或间接可访问)对象,和标记-清除法类似;

    ②清除阶段,将上一轮存活对象压缩到内存的一端,之后清理边界。

    优点:可以减少内存碎片,避免分配大对象时空间不够。

    复制算法:

    它将堆上的内存分为两个大小相等的区域,一个是空闲区域,一个是活动区域。在程序运行中,实际使用的是活动区域,也就是有50%的空间被浪费掉。 

    实现过程:1.找出活动空间中所有存活的对象。2.将这些存活的对象复制到空闲区域。3.将之前的活动空间清空,然后,就变为空闲空间了,而存活对象所在的区域,则变为活动空间了。

    优点,就是,内存回收完毕后,有一大片连续的可用空间。缺点,当然是,在程序运行期间,有50%的内存空间被放着,只有在发生内存回收的时候,GC才会借用空闲区域来实现内存回收工作。

    复制算法与标记-压缩法对比:

    复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以复制算法仅仅应用在新生代,而老年代一般不能直接选用这种算法,使用标记-压缩法。

    标记-压缩法与标记-清除法对比:

    根据老年代的特点,有人提出了“标记-压缩”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。也可以减少内存碎片。

    参考资料来源:

    http://www.cnblogs.com/ttylinux/p/3886561.html

    https://blog.csdn.net/m0_37860933/article/details/82154989

  • 相关阅读:
    qt忙等与非忙等
    获得文件路径 _pgmptr, _makepath, _splitpath
    RGB2YCbCr RGB2Gray
    qt Cannot connect creator comm socket /tmp/qt_temp.S26613/stub-socket: No such
    64位Ubuntu系统安装OpenCV 2.4.x+ffmpeg 完美解决方案
    vim按下ctrl+s僵死
    win32程序应用mfc库
    error LNK2005: _DllMain@12 已经在 dllmain.obj 中定义
    JavaScript中的浅拷贝和深拷贝
    Set和Map
  • 原文地址:https://www.cnblogs.com/money131/p/10664453.html
Copyright © 2020-2023  润新知