一、标记清除算法

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

  这种算法虽然非常的简单,但是也有很多缺点: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. EF CodeFirst简单实例

    运行环境:VS2012,添加的EntityFramework为6.0.2 版本不用太关心,只要知道原理就行了: 基本代码就这几行: namespace ConsoleApplication1 {    ...

  2. java 修改文件

    public void fileAlter(String fileName,String content) throws IOException{                 BufferedRe ...

  3. How to map host ip and port to Hyper-V

    1.1       Add an port proxy netsh interface portproxy add v4tov4 listenport=hostport listenaddres=ho ...

  4. Think In Java 读后感

         近期拜读了Think in Java 一书,这里是一些读后感.        此书不仅仅是市面上那种教会你怎么用系统API来编程的书,那种书太多.        此书不仅仅从头开始讲述了如何 ...

  5. 10 华电内部文档搜索系统 search03

    上一节讲解了怎么在Struts 2下面使用内置对象传值,在Struts 2下面是用Session或者Request存放对象.在Struts 2下面是用内部对象传值,和JSP页面下面稍微有些不同.但是实 ...

  6. 2-字符串模拟- URL映射

    问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...

  7. Mysql蠕虫复制

    将查询出来的数据插入到指定表中,形如: INSERT into user_info(version,create_user_count,create_pc_count) select version, ...

  8. Go 网络编程笔记

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

  9. 3.3.5 高效读取:不变模式下的CopyOnWriteArrayList

    源码分析:读写(get,add) 一:get 方法 private E get(Object[] a, int index) { return (E) a[index];}可以看到读取数据的时候 没有 ...

  10. C#编程之程序集和反射

    这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了.应该把学到的东西变成自己 ...