JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程。所有的垃圾收集算法的具体实现都是遵循这三种算法思想而实现的。

1.标记-清除算法

标记-清除(Mark-Sweep)算法是最基础的垃圾收集算法。正如其名字描述的那样,该算法分为两个阶段:“标记”和“清除”。首先标记出所有可以被回收的对象,然后经过一轮垃圾回收将所有被标记的对象的内存空间释放,即清除可被回收的对象。标记-清除算法的执行过程如下图所示:

该算法的优点是逻辑简单,最初想到的垃圾收集算法就是这种。之后的收集算法都是针对该算法的不足进行改进而产生的新算法。该算法主要存在两种不足:一是标记和清除两个阶段都比较低效;二是这种算法虽然收回了内存,但是容易导致内存中有大量的不连续的小的内存区域(内存碎片)。当有一个大的对象需要创建时,可能出现虽然总的可用内存很多,但是没有一个连续的大的内存空间来存放大对象的情况,从而导致了过早的再一次GC。

2.复制算法

为了解决标记-清除算法效率低以及内存碎片的问题,出现了复制(copying)算法。该算法的思想是将整个内存空间分为两个大小相同的空间。同一时期只在一个内存空间上创建对象,当该部分内存满了之后,执行垃圾回收。垃圾回收的过程:首先将不能回收的依然可用的对象复制到另一个内存空间上,然后将之前的一个内存空间直接清空。经过该轮垃圾回收后,之前的一个内存空间对象被全部清空了,活着的对象被复制到了另一个内存空间上,此时再创建对象就在另一个内存空间上分配空间了。复制算法的执行过程如下图所示:

该算法的优点是逻辑简单,执行高效。但缺点是实际只使用了一半的可用内存,浪费了一半的内存。在商业的JVM中一般使用复制算法来回收新生代的内存空间。因为新生代中的对象大部分都是使用一次就被抛弃的对象,所以新生代中的对象的存活率是很低的。绝大多数情况下符合80:20的原则。复制算法的具体实现上,是将新生代内存区域划分为8:1:1的三块区域,8的区域叫做Eden区,两个1都叫做Survivor区,分配内存时,首先在一个Survivor区和Eden区分配,当垃圾回收时,将上述两个区的活着的对象复制到另一个Survivor区,然后将Eden区和原来的那个Survivor区清空。这样的话使用了整个可用内存的90%,大大减小了浪费。当然,会出现垃圾回收时一个Survivor区装不下所有存活对象的情况(很少发生),当出现时,就会进行分配担保,由其他内存区域(一般是老年代)来存放溢出的对象。

3.标记-整理算法

复制算法对于对象存活率很低的情况是高效的,但是当对象的存活率非常高时,就变得非常低效了。在老年代中,对象的存活率很高,所以不能使用复制算法。于是根据老年代的对象特点,提出了标记-整理(Mark-Compact)算法。标记-整理算法也分为两个阶段:标记和整理。第一个阶段与标记-清除算法一样:标记出所有可以被回收的对象。第二个阶段不再是简单的清除无用对象的空间,而是将后面的活着的对象依次向前移动。将所有的活着的对象都移动成内存空间中前段连续一个区域,之后的连续的区域都是可分配的没有使用的内存空间。标记-整理算法的执行过程如下图所示:

4.小结:分代收集思想

当前商业虚拟机中一般采用“分代收集算法”。分代收集算法是根据对象的特点将内存空间分成不同的区域(即不同的代),对每个区域使用合适的收集算法。在JVM中一般分为新生代和老年代,新生代中对象的存活率比较低,使用复制算法简单高效;在老年代中,由于对象的存活率较高,所以一般采用标记-整理算法。

对于哪种算法最好,我只能说,没有最好的算法,只有最适合某一种场景的某一种算法。正是因为垃圾收集的对象各有特点,才诞生了多种不同的收集算法。就像语言一样,没有必要去争论Java最好,C++最强。每一个语言的存在必然有其使用场景和适合的地方。兼听则明,多多学习就是了。

参考:《深入理解Java虚拟机-JVM高级特新与最佳实践》第二版 周志明著

图片来自:http://blog.csdn.net/java2000_wl/article/details/8022293

JVM三种垃圾收集算法思想及发展过程的更多相关文章

  1. FIFO、LRU、OPT这三种置换算法的缺页次数

    考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6 当内存块数量分别为3时,试问FIFO.LRU.OPT这三种置换算法的缺页次数各是多少? 答:缺页定义 ...

  2. 排序—时间复杂度为O(n2)的三种排序算法

    1 如何评价.分析一个排序算法? 很多语言.数据库都已经封装了关于排序算法的实现代码.所以我们学习排序算法目的更多的不是为了去实现这些代码,而是灵活的应用这些算法和解决更为复杂的问题,所以更重要的是学 ...

  3. 基于C#程序设计语言的三种组合算法

    目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...

  4. 网络中,FIFO、LRU、OPT这三种置换算法的缺页次数

    FIFO.LRU.OPT这三种置换算法的缺页次数 转载  由于要考计算机四级网络,这里遇到了问题,就搜了一些资料来解疑. 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3 ...

  5. 三种Hash算法对比以及秒传原理.

    三种Hash算法对比以及秒传原理 CRC (32/64)   MD5  Sha1 分5个点来说 1.校验值长度 2.校验值类别 3.安全级别 4.应用场景 1).校验值长度 CRC(32/64) 分别 ...

  6. 创建B树,动态添加节点,并使用三种遍历算法对树进行遍历

    ks17:algorithm apple$ cat btree_test.c ///********************************************************** ...

  7. JVM探秘:垃圾收集算法

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集算法 垃圾收集算法主要有标记-清除算法.复制算法.标记-整理算法.分代收集算法 ...

  8. 「给产品经理讲JVM」:垃圾收集算法

    纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了.从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经 ...

  9. jvm七种垃圾收集器

    JVM_七种垃圾收集器介绍   本文中的垃圾收集器研究背景为:HotSpot+JDK7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老 ...

随机推荐

  1. LabelFrame

    LabelFrame组件是Frame组件的变体. 默认情况下,LabelFrame会在其子组件的周围绘制一个边框以及一个标题. 何时使用LabelFrame组件?当你想要奖一些相关的组件分为一组的时候 ...

  2. SVN上传项目步骤

    1.svn上传项目  首先选中父工程 ,右键选中Team的share project 2.share完再选中SVN 3.选中项目  一个一个share project 4.

  3. laravel5.5 使用alipay SDK报错Cannot redeclare Encrypt() (previously declared in ../vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:448)

    错误现象: 在laravel5.5 中,使用alipaySDK 报错: Cannot redeclare Encrypt() (previously declared in ../vendor/lar ...

  4. 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池)

    一.本文产生原由: 之前文章<总结消息队列RabbitMQ的基本用法>已对RabbitMQ的安装.用法都做了详细说明,而本文主要是针对在高并发且单次从RabbitMQ中消费消息时,出现了连 ...

  5. Centos常用命令之:ls和cd

    在使用centos这个linux系统的时候,我们总是免不了需要查看当前目录中的内容,需要切换到别的目录,新建删除等等一系列在window中非常普通的操作. 那在linux中这些操作是什么样的呢. 在l ...

  6. ●BZOJ 3512 DZY Loves Math IV

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3512 题解: $$求ANS=\sum_{i=1}^{N}\sum_{j=1}^{M}\phi ...

  7. 【HDU 2669】Romantic

    Problem Description The Sky is Sprite.The Birds is Fly in the Sky.The Wind is Wonderful.Blew Throw t ...

  8. CTSC2017 铁牌记

    Day 0: 先到了丽都酒店. 看见北京八十中学生在发胸牌手册和T恤,领完之后开始分房间. 我和ryc一屋,lyd和ysq一屋,yzy和gzz分到了珀利酒店,老师尝试了半天把我们分到一个酒店,失败了. ...

  9. Tensorflow从入门到精通之——Tensorflow基本操作

    前边的章节介绍了什么是Tensorflow,本节将带大家真正走进Tensorflow的世界,学习Tensorflow一些基本的操作及使用方法.同时也欢迎大家关注我们的网站和系列教程:http://ww ...

  10. 【linux】---常用命令整理

    linux常用命令整理 一.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: l ...