美文网首页
JVM的垃圾收集算法

JVM的垃圾收集算法

作者: 代码的搬运工 | 来源:发表于2022-03-26 20:06 被阅读0次

1、分代收集理论

收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

在Java堆划分出不同的区域之后,垃圾收集器才可以每次只回收其中某一个或者某些部分的区域——因而才有了“新生代收集(Minor GC/Young GC)”、“老年代收集(Magor GC/Old GC)”和“整堆收集(Full GC)”这样的回收类型的划分;也才能够针对不同的区域安排与里面存储对象存亡特征相匹配的垃圾收集算法——因而发展出了“标记-清除算法”、“标记-复制算法”和“标记-整理算法”等针对型的垃圾收集算法。

2、标记-清除算法

标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。

它的主要缺点有两个:第一个时执行效率不稳定,第二个时内存空间碎片化严重。

标记-清除算法的执行过程如下图所示:

3、标记-复制算法

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

它的主要缺点是内存空间浪费严重。

标记-复制算法的执行过程如下图所示:

现在的商用Java虚拟机大多都优先采用了这种收集算法去回收新生代。

将整个新生代按照8:1:1的比例划分为三块,最大的称为Eden区,较小的两块分别称为Survivor0区和Survivor1区。

对象先在Eden区中分配,首次GC时,将Eden区存活的对象复制到Survivor0区(此时Survivor1区为空),Eden区整体回收。对象接着在Eden区中分配,再次GC时,将Eden区和Survivor0区存活的复制到Survivor1区,Eden区和Survivor0区整体回收,接下来就是循环往复这个过程。直到年龄达到阈值(默认为15),进入老年代。

注:大对象直接进入老年代

4、标记-整理算法

标记出所有需要回收的对象或标记出所有存活的对象,在标记完成后,让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

它的缺点是操作复杂并且得全程暂停用户应用程序(Stop The World,STW)。

标记-整理算法的执行过程如下图所示:

相关文章

  • Jvm之CMS垃圾收集器

      这篇文章主要介绍JVM的CMS垃圾收集器,以及JVM提供的垃圾收集算法。 一、垃圾收集算法   JVM提供的三...

  • JVM学习笔记(3)-垃圾收集算法

    JVM学习笔记(1)-内存管理机制 JVM学习笔记(2)-内存分配与回收 垃圾收集算法 JVM垃圾收集算法有四种:...

  • 常见面试题

    JVM JVM 内存结构 垃圾收集策略与算法记回收,标记清除,复制算法 HotSpot 垃圾收集器 cms hos...

  • JVM Hostspot虚拟机

    jvm HotSpot 虚拟机垃圾收集器、收集算法、收集过程

  • 面试官:谈谈你对JVM垃圾收集器的了解

    本文默认JVM为HotSpot。之前已经介绍过常见的垃圾收集算法,这次再来说说JVM具体实现了这些算法的垃圾收集器...

  • 2020互联网Java后端面试专题解析—JVM21题

    前言 文章对 JVM 内存区域分布、JVM 内存溢出分析、JVM 垃圾回收算法/垃圾收集器、JVM 性能调优工具及...

  • JVM第二弹

    JVM第二弹 GC分代收集算法VS分区收集算法 分代收集算法 当前主流的VM垃圾收集都采用“分代收集“算法,这种算...

  • JVM(八)-垃圾回收机制与垃圾收集器

    JVM垃圾回收(GC)模型 垃圾判断算法 GC算法 垃圾收集器的实现和选择 垃圾判断算法 引用计数法(Refere...

  • JVM

    JVM(1):Java 类的加载机制 JVM(2):JVM内存结构 JVM(3):Java GC算法 垃圾收集器 ...

  • 05 | JVM-GC收集器

    常见的垃圾收集器 上一篇文章中介绍了JVM的GC常见算法,而JVM的垃圾收集器就是这些算法使用编程语言的具体实现,...

网友评论

      本文标题:JVM的垃圾收集算法

      本文链接:https://www.haomeiwen.com/subject/cdhsjrtx.html