文档章节

JVM系列扩展:常见垃圾回收算法

那位先生_
 那位先生_
发布于 2016/10/16 13:59
字数 1252
阅读 26
收藏 2

对象存活算法

在回收垃圾对象之前,垃圾收集器需要确认哪些对象“存活”和那些对象应该被回收

引用计数(Reference Counting)

引用计数是最古老的一种算法,在微软的COM组件技术,Adobe的ActionScript3中都有使用。实现就是:对于一个对象A,只要任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1;当一个对象的计数器值为0时,则对象A则不可能再被使用。

引用计数的缺点在于:

  • 无法处理循环引用的情况,例如A引用了B,B引用了A,但是系统中不存在任何第3个对象引用了A,B(此时A,B应该是要被回收的),但是A,B的计数器都为1,无法被回收。
  • 引用计数器要求每次引用产生或者消除时,都需要做相应的加减运算,会对系统性能产生影响。

可达性分析算法 (Reachability Analysis)

在主流的商用程序语言的主流实现中,都是通过可达性分析来判断一个对象是否应该存活的。其基本思想就是通过一系列的称为“GC Roots”的对象作为根节点,从这些节点开始向下搜索,搜索所走过的路径称为“引用链”。当一个对象到“GC Roots”没有任何的引用链相连时,则证明此对象可以被回收。

在Java虚拟机中,可作为GC Roots的对象包括以下几种:

  • 虚拟机栈(栈帧中局部变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(即一般说的native方法)引用的对象

扩展:Java语言的四种引用类型:强引用,软引用,弱引用,虚引用

垃圾回收算法

标记清除算法(Mark-Sweep)

标记清除算法将垃圾回收分为标记清除两个阶段。在标记阶段,标记所有从根节点开始的可达对象,此时未标记的对象即为垃圾对象,等待回收。在清除阶段,清除所有的未标记对象。

标记清除的缺点在于:

  • 回收后的空间容易产生空间碎片

复制算法(Copying)

复制算法的核心思想是将原有的内存空间分为两块,每次只使用其中的一块,在垃圾回收时,将存活的对象复制到另一块未被使用的空间,之后清除原来使用的空间中的所有对象。

复制算法的优点:

  • 如果系统的垃圾对象多,复制算法要复制的存货对象就少,因此效率会高
  • 不会产生空间碎片

缺点:

  • 可用内存折半,总是存在一块内存不被使用

在Java虚拟机新生代串行垃圾回收器中,使用了复制算法的思想。新生代被分为eden,from,to三个内存空间。其中fromto是两块大小相当,地位相同且可进行角色互换的空间,也统称为survivor空间。

标记压缩算法 (Mark-Compact)

相比于复制算法存活对象少,垃圾对象多的情况,标记压缩算法通常用于大部分对象都是存活对象的情况(老年代的回收算法)。它在标记清除算法的基础上做了一些优化,在标记存活对象后,将所有的对象压缩到内存的一端,然后再清除边界外的所有空间。

优点:

  • 避免产生碎片
  • 内存使用率高,不存在内存折半的现象

因为只是比标记清除多了一个压缩的步骤,所以也被称为标记清除压缩算法(MarkSweepCompact)

分代算法 (Generational Collecting)

在上面的一系列算法中,并没有哪种算法可以完全的替代其他的算法。它们各自具备自己独特的优势和特点。因此,将内存区间根据对象的特点分成几块,每块使用不同的回收算法,以提高垃圾回收效率,这就是分代算法。

在Java虚拟机中,所有的新建对象都会优先存放在新生代内存空间中,对于新生代内存空间中的对象,很容易就被回收,因此新生代适合复制算法。当一个对象经过几次回收后仍然存活,该对象就会被放入老年代内存空间,在老年代内存空间的对象,经过几次垃圾回收后仍然存活的概率通常很大,根据分代的思想,老年代适合标记压缩或标记清除算法

© 著作权归作者所有

那位先生_

那位先生_

粉丝 131
博文 109
码字总数 242433
作品 0
深圳
后端工程师
私信 提问
加载中

评论(0)

JVM系列第8讲:JVM 垃圾回收机制

在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由《Java 虚拟机规范》指定的,每个 Java 虚拟机可能都有不同的实现。其实涉及到 Java 虚拟机的内存,就不得不谈到 Ja...

陈树义
2018/11/21
0
0
深入Java虚拟机之 -- 总结面试篇

系列文章: 深入Java虚拟机之 -- 总结面试篇 深入Java虚拟机之 --- JVM的爱恨情仇 JAVA 垃圾回收机制(一) --- 对象回收与算法初识 JAVA 垃圾回收机制(二) --- GC回收具体实现 深入Java虚拟机...

夏至的稻穗
2019/05/06
0
0
JVM系列第9讲:JVM垃圾回收器

前面文章中,我们介绍了 Java 虚拟机的内存结构,Java 虚拟机的垃圾回收机制,那么这篇文章我们说说具体执行垃圾回收的垃圾回收器。 总的来说,Java 虚拟机的垃圾回收器可以分为四大类别:串...

陈树义
2018/11/22
0
0
《成神之路-基础篇》JVM——垃圾回收(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收 ...

2018/05/05
0
0
JVM 性能优化, Part 4: C4 垃圾回收

ImportNew注:本文是JVM性能优化 系列-第4篇。前3篇文章请参考文章结尾处的JVM优化系列文章。作为Eva Andreasson的JVM性能优化系列的第4篇,本文将对C4垃圾回收器进行介绍。使用C4垃圾回收器...

梁杰_Jack
2014/10/30
72
0

没有更多内容

加载失败,请刷新页面

加载更多

1核2G云服务哪家便宜?

前言: 又到一年续费时,我们来盘点哪些云厂商新手活动给力?有人说我又不是新手,有啥用?你要知道你作为家里唯一一位程序员,有强大的家庭后盾,比如爸爸妈妈爷爷奶奶叔叔阿姨......... 不过...

王念博客
9分钟前
142
0
JavaScript 箭头函数:适用与不适用场景

JavaScript 箭头函数:适用与不适用场景 现代 JavaScript 中最引人注目的功能之一是引入了箭头函数,用 => 来标识。 这种函数有两大优点 – 非常简洁的语法,和更直观的作用域和 this的绑定。...

王囧草
18分钟前
46
0
Docker快速入门

1 几个概念 Docker可以把开发的软件代码以及软件所依赖的所有运行时环境、依赖类库都打包成一个容器镜像,因此使用docker打包软件可以让程序员开发的程序运行在各种不同的计算机硬件环境中。...

即将秃头的Java程序员
19分钟前
68
0
Zookeeper-03-权限管理

Zookeeper-03-权限管理 用的不多,暂时先不整理了

moon888
21分钟前
36
0
渲染学习笔记——GPU应用阶段

1.GPU流水线 注:绿色可编程,橙色可控不可编程,红色完全不可控 2.顶点着色器 顶点着色器计算速度快于片元着色器,所以很多中间数据在顶点着色器计算。 3.裁剪 4.屏幕映射 5.三角形 6.片元着...

myctrd
27分钟前
61
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部