一、标记清除算法

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

  这种算法虽然非常的简单,但是也有很多缺点: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. iOS常用动画 类封装

    //这是一个很好的动画封装类 很容易明白很详细 和大家分享 // CoreAnimationEffect.h // CoreAnimationEffect // // Created by Vince ...

  2. Linux 入门知识一(附上如何解决Ubuntu的root密码问题)

    .centos有拥有七个控制台,其中第一到第六个是字符界面,第七个是图形界面 切换的快捷键是ctrl+shift+fn(n为自然数)   输入tty的话,可以检查当前处于哪个控制台   如何在cent ...

  3. 深入探究jvm之GC的参数调优

    在上一篇博客记录了GC的算法及种类,这篇博客主要记录一下GC的参数如何调整以提高jvm的性能. 一.堆的回顾: 堆的内存空间总体分为新生代和老年代,老年代存放的老年对象,新构造的对象分配在eden区中 ...

  4. 全部物料的交期都要加上两天 V_OUT_PR

    DUE_DATETIME加上两天就可以,如果只是部分物料的话,就要根据物料组或者别的一些条件去判断

  5. 使用cloudrea manager管理已有的cdh集群(转)

    转自:http://blog.51cto.com/teacheryan/1912116 本文介绍如何搭建cloudera manager去接入已有hadoop组件(cdh). 一.下载必备文件: 1. ...

  6. Nginx源码完全注释(4)ngx_queue.h / ngx_queue.c

    队列头文件ngx_queue.h #include <ngx_config.h> #include <ngx_core.h> #ifndef _NGX_QUEUE_H_INCL ...

  7. IDEA05 mybatis插件之MyBatisCodeHelper-Pro

    前提准备: >IDEA专业版本 1 安装MyBatisCodeHelper-Pro IDEA提供了插件安装功能,可以根据开发需要安装适合的插件 >help -> find actio ...

  8. LoadRunner11学习记录七 -- 负载生成器、事务&集合点顺序、HTML&URL录制

    1.什么情况下用到负载生成器? 当需要使用多台测试机对同一服务器同时压力测试时,需要配置负载生成器. 2.LoadRunner中事务和集合点的放置顺序问题 1)事务放在集合点前面 这时事务的时间包含了 ...

  9. 实践作业3:白盒测试----学习Junit框架DAY10.

    JUnit - 测试框架 首先应该了解什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能 ...

  10. list 返回列表null替换

    function formatt(rec, val, index) { if (rec === null || rec == "null") { return "0&qu ...