垃圾回收机制

何为垃圾?

什么是垃圾,垃圾指的是Java程序中已经没有使用的对象,这些对象占用堆的空间,而毫无用处,即可称作“垃圾”,为此JVM需要设计一个垃圾回收机制,将这些空间清除。

如何判断哪些是垃圾?

上面已经讲过,不在使用的对象 是 “垃圾”。在JVM中我们使用两种算法来计算此对象是否是没有使用的。

  • 引用计数法:每次引用一个对象,都添加一次引用次数,被去除引用时,就减少一次引用次数,当引用次数为0时,就是可以回收了。(这种方式有一个致命问题,就是循环引用,循环引用会导致对象无法被回收)
  • 可达性分析法:定义一些数据为GC ROOT,从ROOT出发,所有可达的对象都是存活的对象,不可达的对象都是“垃圾”。(Java虚拟机采用的方式)
  • 哪些数据可以成为GC ROOT呢?
    通常包括了:

  • 所有当前被加载的Java类
  • Java类的引用类型静态变量
  • Java类的运行时常量池里的引用类型常量
  • VM的一些静态数据结构指向GC堆里的对象的引用
  • 等等
  • 如何进行垃圾回收?

    垃圾回收算法简单的说有三种:

  • 标记-清除算法
  • 标记-复制算法
  • 标记-整理算法
  • 标记-清除算法

    将对象的生命周期分为“标记”和“清除”两种标记,对标记为“清除”的对象进行回收空间内存。(最初的垃圾收集算法)

    缺点:执行效率不稳定;内存空间的碎片化问题;

    如何理解碎片话问题:空间碎片化,意味着存在大量的间隔的空间,jvm在为对象分配空间时,是将同一对象分配在连续的内存中,当需要分配较大对象时无法找到足够连续内存而不得不提前触发另一次垃圾收集动作,将空间标记为“清除”标记的对象清空,从而保证这个较大的对象能够插入其中。

    标记-复制算法

    标记-复制算法也称为复制算法,或者半区复制。此算法为了解决标记-清除算法的碎片化问题而出现的。
    它是将内存分为两个大小相同的内存块。在进行垃圾收集时,只需要把存活的对象复制到另外一个空间,当前空间直接清空。

    标记-整理算法

    对标记清除算法的另一种改进方式,回收对象时,让所有存活的对象都向内存空间一端移动,然后直接清除掉边界以外的内存。

    声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!

    (0)
    上一篇 2022年7月20日
    下一篇 2022年7月20日

    相关推荐