zoukankan      html  css  js  c++  java
  • JVM(4)--垃圾回收算法

    1、标记清除法

    顾名思义,算法分为标记和清除两个阶段,首先标记处需要回收的对象,在标记完成后统一回收。

    缺点是标记和清除效率都比较低,而且容易产生大量不连续碎片内存。导致在分配较大对象时无法找到足够的空间,使得触发另一次标记清除。

    原书图示如下:

    2、复制算法

    将内存分为两块,每块占50%,当其中一块内存用完,就把所有存活对象复制到另一块内存,再清理掉原本的已使用空间。

    此算法不用考虑内存碎片的问题,只要移动堆顶指针,按照顺序分配内存就行,实现简单,运行高效。

    缺点是将内存一分为二,代价太大。

    现在的商业虚拟机大多都使用了这个方法,研究发现,98%的对象会在第一次回收就被清理掉,所以不必按照50%划分,一般会默认建立8:1:1的Eden区和两个Survivor区,每次清理一个Eden区一个Survivor区的内容,复制到另一Survivor中。当Survivor内存也不够时,还可以依赖老年代。

    图示如下:

     3、标记整理算法

    一般用于老年代。

    复制算法需要对额外空间进行依赖来复制,为了解决这个问题,可以标记所以存活对象,向一端移动,再清理其他所有内存。

    图示如下:

    4、分代收集算法

    把JVM中的堆分成新生代和老生代,在新生代中因为每次都有大量死去,所以选择复制算法,每次只要付出复制少量存活对象的成本就行。

    在老生代中,因为对象存活率高,所以一般使用标记清楚或者标记整理。

  • 相关阅读:
    【简●解】[AHOI2009]中国象棋
    【讲●解】KMP算法
    【简●解】POJ 1185,LG P2704【炮兵阵地】
    学习网站整理
    【讲●解】火车进出栈类问题 & 卡特兰数应用
    洛谷4556 [Vani有约会]雨天的尾巴
    BZOJ2212或洛谷3521 [POI2011]ROT-Tree Rotations
    洛谷1119 灾后重建
    洛谷1462(重题1951) 通往奥格瑞玛的道路(收费站_NOI导刊2009提高(2))
    BZOJ2721或洛谷1445 [Violet]樱花
  • 原文地址:https://www.cnblogs.com/blogofjzq/p/9407201.html
Copyright © 2011-2022 走看看