一、标记清除算法

标记清除算法顾名思义,就是将需要回收的对象进行标记,然后进行清除。那么这个算法就有标记和清除两种过程。标记过程主要是通过可达性分析算法进行判断存活对象,然后遍历所有的对象来找到需要回收的对象,开始进行清除过程。

  这种算法虽然非常的简单,但是也有很多缺点:1.效率问题,上面我们已经将到了,这个算法在标记的时候需要遍历GC ROOT的根节点,而且在清除的时候是遍历了所有对象进行清除,这样回收的效率就会很低。

 2.空间碎片过多,这个问题可以从上面就可以看出,回收的空间是不连续的,这样就会出现大量的空间碎片,如果大对象无法分配到足够的内存,就会提前触发GC(也可能会出现内存担保)。

二、复制算法

为了解决标记清除算法中的效率问题,就有了复制算法,我们通过图来了解这个算法:

1.将堆分为两个A、B空间(也可以是多个空间)

2. 所有的对象都创建在A空间

3.当进行垃圾回收的时候将A中标记的对象全部复制到B空间中,并且将对象排序

4.然后将A中的空间全部清除,接下来创建的对象,在B空间中创建

5.B空间进行垃圾回收时,则重复第一步开始进行回收

三、jvm中的标记清除算法

从上图可以看出这个算法也有一个很大的缺点,就是内存区域的极大浪费,所以在JVM中,对这种算法又进行了一次调优,这种调优方式不是适用于G1垃圾回收器JAVA9开始(默认的垃圾回收器为G1,有的java8默认的垃圾回收器也是G1),这就涉及到一个新的知识:新生代和老年代。

   新生代:新创建的对象都会存放到新生代中(大对象除外)。他的特点是:很快就会被GC回收掉的或者不是特别大的对象。

  老年代:在新生代每进行一次垃圾收集后,就会给存活的对象“加1岁”,当年龄达到一定数量的时候就会进入老年代(默认是15)。另外,比较大的对象也会进入老年代(这个会在后面的章节讲到),因此,老年代中存放的都是一些生命周期较长的对象或者特别大的对象。

  jvm中使用标记清除算法,主要用于回收新生代。

  1.将堆空间划分为一个Eden区域(占80%内存空间)和两个survivor(to和form区域,各站10%),此时空间中创建了一些对象

2.将Eden中存活的对象放入from区域。

3.一般来说,Eden区域中存活的对象不是很多,但是如果对象在survivor区域中依然存活,那么开始进行垃圾回收时,将from区域的存活对象放入to区域中,清空to区域和eden区域

4.接下来的回收就用to区域代替from区域,重复第一步进行开始。如果存活对象在进行一定次数的垃圾回收后,依然存活,那么这个对象就进入老年代

四、标记整理清除算法

这种算法主要用于老年代的垃圾回收,这个算法和标记清除类似,只是多了整理这一步骤,这个步骤主要是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

五、分代收集算法

这种算法将以上算法进行了整合,根据新生代内存回收率搞的内存区域先用标记清除和复制算法。对老年代回收率较低区域的采用标记清除整理算法。

深入了解java虚拟机(JVM) 第六章 垃圾回收算法的更多相关文章

  1. (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  2. Java虚拟机(二):垃圾回收算法

    一.介绍 GC(Garbage Collection),垃圾收集 Java中,GC的对象是堆空间和永久区 二.GC算法 1. 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 Java中未使用,使 ...

  3. JVM学习总结二——垃圾回收算法

    昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...

  4. JVM内存模型,垃圾回收算法

    JVM内存模型总体架构图 程序计数器多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源.因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指令.线程 ...

  5. 轻松学JVM(四)——垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...

  6. 深入理解JVM(四)——垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...

  7. JVM内存模型及垃圾回收算法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. JVM学习(三):垃圾回收算法

    局部性原理和分代回收思想 大学学习操作系统或者计算机组成原理的时候都提到一个重要概念,叫局部性原理. 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小 ...

  9. 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结

    垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象. ...

随机推荐

  1. 浅谈Trigger

  2. JAVA中List的几个方法

    add()方法.插入某个位置的数据,他有两个参数一个参数是下标,一个参数是元素.需要注意的是下标大小应该小于等于List集合大小,否则就会抛出下标越界异常! 代码:    public static ...

  3. word2012写论文之参考文献和图片

    每次写论文都感到word的“博大精深”啊,一个版本一个样,一些原来版本还有的功能,后来的版本就没有了,一些原来版本叫这个名字的功能,下一个版本就换了个名字,你也太考验你用户的智商和耐心了吧!即使同一份 ...

  4. Eclipse创建javaWeb项目工程

    首先,想作为一个较为标准的程序员,应该把自己的开发工具eclipse设置成与公司中大多数程序员的设置一样,比如说工作的字符编码为UTF-8,字体大小等等. 在刚下载好的eclipse中刚进去是没有To ...

  5. 【2018沈阳赛区网络预选赛J题】Ka Chang【分块+DFS序+线段树】

    题意 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L的点的值全部增加X.操作2.查询以x为根的子树的结点值得和. 其中N,Q< ...

  6. Spark 性能相关参数配置详解-任务调度篇

    随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化. 由于篇 ...

  7. c++ 享元模式(flyweight)

    举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子.现在要实现一个围棋程 序,该怎么办呢?首先要考虑的是棋子棋盘的实现,可以定义一个棋子的类,成员变量包括棋子的颜色.形状.位置等信息,另外再定 ...

  8. Java-CSV文件读取

    import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import ja ...

  9. 搭建Spring开发环境并编写第一个Spring小程序

    搭建Spring开发环境并编写第一个Spring小程序 2015-05-27      0个评论    来源:茕夜   收藏    我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...

  10. Luogu 4238 【模板】多项式求逆

    疯狂补板中. 考虑倍增实现. 假设多项式只有一个常数项,直接对它逆元就可以了. 现在假如要求$G(x)$ $$F(x)G(x) \equiv 1 (\mod x^n)$$ 而我们已经求出了$H(x)$ ...