JVM学习笔记-垃圾收集器

JVM学习笔记-垃圾收集器

首页模拟经营垃圾收集器空闲建造师游戏更新时间:2024-09-22

之前我们了解了垃圾回收算法,现在一起来看看垃圾回收的具体实现:垃圾收集器。Java虚拟机规范对于垃圾收集器应该如何实现没有具体的规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器有可能有较大的区别。以下列出的是基于JDK 1.7 Update 14之后的HotSpot虚拟机(在这个版本中正式提供了商用的G1收集器):

上图展示了7种不同分代的收集器,如果两个收集器中存在连线,就说明它们之间可以搭配使用。虚拟机所处的区域,则说明该虚拟机是属于新生代收集器还是老年代收集器。其中属于新生代的收集器有Serial、ParNew、Parallel Scavenge,属于老年代的收集器有CMS、Serial Old、Parallel Old。而G1收集器在新生代和老年代中都可以用。

需要强调的是,到目前为止还没有最好的垃圾收集器出现,更加没有万能的收集器,所以我们选择的是对具体应用最合适的收集器,一般来说是两种收集器搭配起来使用。

1、Serial收集器

Serial/Serial Old收集器的运行示意图如下:

2、ParNew收集器

ParNew/Serial Old收集器的运行示意图如下:

3、Parallel Scavenge收集器

Parallel Scavenge/Parallel old收集器的运行示意图如下:

4、Serial Old 收集器

Serial/Serial Old收集器的运行示意图如下:

5、Parallel Old 收集器

Parallel Scavenge/Parallel old收集器的运行示意图如下:

6、CMS收集器

CMS收集器的运行过程如下:

CMS收集器的优点:

由于以上特点,CMS收集器也被称为并发低停顿收集器(Concurrent Low Pause Collector)。

但CMS也不是完美,它有三个明显的缺点:

7、G1收集器

G1(Garbage-First)收集器是当今收集器技术发展的最前源成果之一,直到JDK7u4,才开始用于商用。

G1是一款面向服务器应用的垃圾收集器,HotSpot团队准备用它来代替CMS收集器。与其他收集器相比,G1收集器具有以下特点:

在G1之前其他收集器进行收集的范围都是整个新生代或者老年代,而使用G1时,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留着新生代和老年代的概念,但新生代和老年代不再是隔离的了,它们都是一部分Region(不需要连续)的集合。

G1收集器之所以可以建立可预测的停顿时间模型,是因为它有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获取的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也是Garbage-First名称的由来)。这种使用Region划分内存空间已经有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能的收集效率。

在G1收集器中,Region之间的对象引用以及其他收集器中的新生代和老年代之间的对象引用,虚拟机都是使用Remember Set来避免全堆扫描的,

如果不计算维护Remember Set的操作,G1收集器的运行大致可以分为以下四个步骤,这些过程与CMS有许多相似之处:

通过下图可以清楚的看到G1收集器运行过程:

由于G1成熟版本的发布时间还很短,没有经过实际应用的考验,网上关于G1收集器的性能测试也非常贫乏,如果原来采用垃圾收集器比如CMS没有出现问题,我们没有理由去选择G1,如果应用追求低停顿,那么G1可以作为一个可尝试的选择。相信随着Oracle对G1的持续改进,G1会成为最终的胜利者。

参考:

深入理解Java虚拟机第3章-周志明

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved