专栏首页JVMGCJVM垃圾回收算法标记清除和复制算法
原创

JVM垃圾回收算法标记清除和复制算法

标记清除算法

当堆中的有效空间被耗尽时,JVM就会停止整个程序(也被称为stop the world),然后开始两项工作.一是:标记, 二是:清除

标记

遍历所有GC Roots,将所有GC Roots可达的对象都标记为存活对象.

清除

遍历堆中所有的对象把没有标记的对象全部清除.

在程序运行期间,当堆中的可用内存被耗尽时,GC线程就会启动并停止程序,GC线程将存活的对象标记一遍,没有被标记的对象就是垃圾对象,最后这些垃圾对象会被清除掉,然后重新唤醒应用程序.

程序运行时堆中对象的状态(默认为0未标记,1为标记过),假如堆内存的可用空间被消耗完,那么GC线程就会启动,停止掉应用程序,使用根可达性算法进行搜索标记.

image-20201101144201836

被标记后的对象状态

image-20201101144531448

使用根可达性算法,所有GC Roots可达的对象都被标记为存活对象,此时已经完成了第一阶段的工作.接下来执行清除操作,执行完清除操作,堆中对象的状态.

image-20201101162751111

没有标记的对象被清除,被标记的对象会被留下,标志为被置为0,应用程序被唤醒.

标记清除的优点是算法简单,缺点如下:

1.效率低下,需要遍历整个堆.进行GC的时候需要停止应用程序

2.垃圾回收后的内存空间是不连续的,因为垃圾对象的分布很随意,那么清除后的内存会不连续. 为了解决这个问题,JVM不得不维护一个空闲链表,又会导致额外的开销.

复制算法

复制算法使用了两块同等大小的内存空间,每次只用一块,垃圾回收的时候,把存活的对象直接另外一块内存,然后剩余的垃圾对象全部一次性清除.好处是复制存活对象的时候就不用考虑内存碎片.唯一的缺点就是内存利用率只有50%.

img

现在的虚拟机一般都用复制算法回收新生代,IBM的研究发现,新生代中的对象98%都是朝生夕死,所以并不需要1:1分配对象,而是将内存分为一个大的Eden和两块小的Survivor空间,每次只使用Eden和一块Survivor. 当进行垃圾回收时,将存活对象一次性复制到一块Survivor空间,最后清除掉Eden和使用过的Survivor空间. HotSpot虚拟机Eden:Survivor=8:1,也就新生代可用的内存达到90%,只会有10%的浪费.当然98%的对象可被回收只是一般的场景,并没有办法保证每次Survivor都能存放的下存活对象,若Survivor空间不够时,需要依靠老年代进行分配担保.

image-20201101173454757

from ,to为Survivor区。

wx.jpg

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 垃圾回收算法(3)-标记清除算法

    标记清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960年提出并成功的发明并应用于Lisp语言。

    一觉睡到小时候
  • 垃圾回收算法|GC标记-清除算法

    GC 标记-清除算法由标记阶段和清除阶段构成。在标记阶段会把所有的活动对象都做上标记,然后在清除阶段会把没有标记的对象,也就是非活动对象回收。

    goodspeed
  • 垃圾回收算法(4)-复制算法

    复制算法首先将或者的内存空间分为2块,每次只使用其中一块,在垃圾会搜时将正在使用的内存中的存活对象复 制到未被使用的内存块中,之后清楚正在使用的内存块中的所有对...

    一觉睡到小时候
  • JVM垃圾回收算法

    java404
  • JVM 垃圾回收算法

    在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。

    一个会写诗的程序员
  • jvm垃圾回收算法

    云123
  • JVM垃圾回收机制和算法详解

    我们今天先聊聊jvm的垃圾回收算法,大家先了解垃圾算法有哪些,在去学习有哪些垃圾回收器,然后我们在学习如何对jvm进行参数调优。

    公众号 IT老哥
  • JVM的垃圾回收算法

    JVM的垃圾回收算法 一,如何判断对象已经消亡 1,引用计数算法 一个对象如果没有任何引用指向它,就可认为该对象已经”消亡“,这种方法有个缺点就是无法检测到引用...

    Spark学习技巧
  • (4)JVM——垃圾回收算法

    介绍:在程序运行过程中,程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭,不用我们关注内存的回收。而 Java 堆和方法区不一样,此处的内存使...

    凡人飞
  • JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

      按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远...

    哲洛不闹
  • JVM (标记-清除算法、复制算法、标记-整理算法、分代收集算法、分区算法)

    在Java堆中存放着所有Java的对象实例 ,在GC执行垃圾收回之前,JVM需要标识出来哪些是对象已经不被引用(垃圾),哪些被引用,而JVM有两种垃圾标识对象是...

    逍遥壮士
  • JVM学习记录-垃圾回收算法

    纪莫
  • 垃圾回收算法与 JVM 垃圾回收器综述

    我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的回收方法。不同回收器的实现细节各有不同,但总的来说基本所有的回收器都会关注如下两个方面:找出所有的存...

    Java高级架构
  • JVM常见垃圾回收算法

    jdk1.7.0_79   众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收...

    用户1148394
  • 简述 JVM 垃圾回收算法

    之前我们学习了 JVM 基本介绍 以及 什么样的对象需要被 GC ?,今天就来学习一下 JVM 在判断出一个对象需要被 GC 会采用何种方式进行 GC。在学习 ...

    周三不加班
  • 13道关于JVM垃圾收集器的面试题,哪些你还不会?

    13道关于JVM垃圾收集器的面试题,哪些你还不会? ...

    Java架构师必看
  • 十个问题弄清JVM&GC(二)

    每个java开发同学不管是日常工作中还是面试里,都会遇到JDK、JVM和GC的问题。本文会从以下10个问题为切入点,带着大家一起全面了解一下JVM的方方面面。

    宜信技术学院
  • 面试官:你对JVM垃圾收集器了解吗?13连问你是否抗的住!

    4、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

    程序员追风
  • JVM系列第8讲:JVM 垃圾回收机制

    在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由《Java 虚拟机规范》指定的,每个 Java 虚拟机可能都有不同的实现。其实涉及...

    陈树义

扫码关注云+社区

领取腾讯云代金券