zoukankan      html  css  js  c++  java
  • 垃圾收集算法

    前面已经知道了如何判断对象会被回收。那么现在来分析一下这些垃圾对象是如何被收集的,通过什么算法收集的。

    GC 常用算法有:

      标记-清除算法

      复制算法

      标记-整理算法

      分代收集算法

    目前主流的jvm(HotSot)采用的是分代收集算法。

    标记-清除(Mark-Sweep)算法

      算法分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象。

      

      该算法的缺点:

        效率问题:整个内存区域一个一个标记是否为垃圾对象,再一个一个清除掉,效率低

        空间问题(标记清除后会产生大量不连续的碎片)

    复制(Copying)算法(适用于年轻代survivor区使用)

      复制算法是将内存分为大小相同的两块,每次只用其中一块,当这一块内存用完了,就将存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次性清理掉。

      

      复制算法优点:

        效率较高

        剩余空间的利用率较高

      从上图可以看出,复制算法效率是比标记-清除算法高的,复制算法只需要在其中一块的内存中标记出哪些是存活对象,再挨个连续放在另外一半内存块中,之后再一次性清除原来那一半内存块的所有对象。并且,可以看到存活对象是连续存放的,也就是说剩余内存也是连续的内存空间,可以用来存放一些较大的对象。剩余空间利用率高。

      复制算法缺点:

        整体内存空间使用率低:将内存一分为二使用,每次只使用一半内存,整体的内存使用率低。

    标记-整理算法

      根据老年代的特点,有人提出了另外一种标记-整理算法。过程与标记-清除算法一样,不过不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉边界以外的内存。

      

     分代收集算法

      当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

      比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。

      而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分噢诶担保,所以我们必须选择“标记-清除”或者“标记-整理”算法进行垃圾收集。

    学习没有一蹴而就,放下急躁,一步一步扎实前进
  • 相关阅读:
    通过百度地图API实现搜索地址--第三方开源--百度地图(三)
    对图片进行各种样式裁对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等剪:圆形、星形、心形、花瓣形等--第三方开源--CustomShapeImageView
    仿UC天气下拉和微信下拉眼睛头部淡入淡出--第三方开源--PullLayout
    【英语】Bingo口语笔记(14)
    【前端】HTML入门笔记
    【英语】Bingo口语笔记(13)
    【英语】20141013 生词
    【英语】20141011 生词
    【Android】Android 学习记录贴
    【英语】Bingo口语笔记(12)
  • 原文地址:https://www.cnblogs.com/jpxjx/p/12553364.html
Copyright © 2011-2022 走看看