JVM三种垃圾收集算法思想及发展过程
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三种垃圾收集算法思想及发展过程的更多相关文章
- 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这三种置换算法的缺页次数各是多少? 答:缺页定义 ...
- 排序—时间复杂度为O(n2)的三种排序算法
1 如何评价.分析一个排序算法? 很多语言.数据库都已经封装了关于排序算法的实现代码.所以我们学习排序算法目的更多的不是为了去实现这些代码,而是灵活的应用这些算法和解决更为复杂的问题,所以更重要的是学 ...
- 基于C#程序设计语言的三种组合算法
目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...
- 网络中,FIFO、LRU、OPT这三种置换算法的缺页次数
FIFO.LRU.OPT这三种置换算法的缺页次数 转载 由于要考计算机四级网络,这里遇到了问题,就搜了一些资料来解疑. 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3 ...
- 三种Hash算法对比以及秒传原理.
三种Hash算法对比以及秒传原理 CRC (32/64) MD5 Sha1 分5个点来说 1.校验值长度 2.校验值类别 3.安全级别 4.应用场景 1).校验值长度 CRC(32/64) 分别 ...
- 创建B树,动态添加节点,并使用三种遍历算法对树进行遍历
ks17:algorithm apple$ cat btree_test.c ///********************************************************** ...
- JVM探秘:垃圾收集算法
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集算法 垃圾收集算法主要有标记-清除算法.复制算法.标记-整理算法.分代收集算法 ...
- 「给产品经理讲JVM」:垃圾收集算法
纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了.从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经 ...
- jvm七种垃圾收集器
JVM_七种垃圾收集器介绍 本文中的垃圾收集器研究背景为:HotSpot+JDK7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老 ...
随机推荐
- 如何用Math.max.apply()获取数组最大/小值
最近似乎对JavaScript有点兴趣了~~~打算好好钻研这个东西.可是,一开始就遇到问题了!!! Math.min.apply(obj,args);//这个obj对象将代替Function类里thi ...
- Git篇(基础)
安装过程省略... 至于安装目录的有关功能,略过... 一.关于初次使用的关键配置命令: 1.配置基本信息,该信息将保存在该用户目录下的.gitconfig文件内 配置用户信息$ git config ...
- innerText、innerHtml与value
1.innerText是id为object的闭合标签内的文本,输入输出的是转义文本(字符串); (label控件用innerText有效)2.innerHtml是<div>标签内的文本, ...
- 【实验吧】CTF_Web_简单的SQL注入之2
直接输入11'报语法错误,然后输入1' and '1'='1 报SQLi detected!,说明有防护,输入1'and'1'='1回显ID: 1'and'1'='1 name: baloteli ...
- Basic command and advice for memcached
Storage Commands set Most common command. Store this data, possibly overwriting any existing data. N ...
- [ZJOI 2010]count 数字计数
Description 题库链接 问你 \([l,r]\) 区间内所有整数中各个数码出现了多少次. \(1\leq a\leq b\leq 10^{12}\) Solution 数位 \(DP\) . ...
- poj3237 树链部分 边权模板
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7384 Accepted: 2001 Description ...
- SVN与Git
一:SVN是什么?SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到S ...
- 如何使用 TeamViewer 配置QuickConnect按钮?
QuickConnect作为TeamViewer中一个比较重要的部分,得到了很多用户的认可.那么在实际运用中,怎么才能设置网页或单个程序的QuickConnect呢?所以小编以此问题为例,教大家如何配 ...
- SQL Server 2008 维护计划实现数据库备份(最佳实践)
一.背景 之前写过一篇关于备份的文章:SQL Server 维护计划实现数据库备份,上面文章使用完整备份和差异备份基本上能解决数据库备份的问题,但是为了保障数据更加安全,我们需要再次完善我们的备份计划 ...