前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JVM 七种垃圾收集器

JVM 七种垃圾收集器

作者头像
用户3596197
发布于 2019-03-01 08:04:05
发布于 2019-03-01 08:04:05
7090
举报
文章被收录于专栏:空帆船w空帆船w

Java 垃圾收集器是垃圾收集算法的具体实现。

下图展示的是 7 种作用于不同分代的收集器,如果两种收集器之前有连接,表示它们可以配合使用。收集器所在的位置表示它是属于新生代收集器还是老年代收集器。

Serial 收集器

单线程串行收集器。即在垃圾清理时,必须暂停其他所有工作线程。

它是采用复制算法新生代收集器

下图是 Serial 收集器的运行过程。

ParNew 收集器

ParNew 收集器是 Serial 收集器的多线程版本。除了使用多线程收集,其他与 Serial 收集相比并无太多创新之处。

默认开启的线程数量与 CPU 数量相同。

在单 CPU 的环境,ParNew 收集器不会比 Serial 收集器更优秀。

Parallel Scavenge 收集器

Parallel Scavenge 收集器也是一个 并行的多线程新生代收集器,使用的是复制算法

特点在于它的目标是达到一个可控制的吞吐量(Throughput)。

吞吐量就是 CPU 用于运行用户代码得时间与 CPU 消耗时间的比值。

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

高吞吐量可以高效率地利用 CPU 时间,尽快完成程序地运行任务,适合在后台运行不需要太多交互的任务。

-XX:GCTimeRatio : 设置吞吐量大小。

-XX:MaxGCPauseMillis : 设置最大垃圾收集停顿时间。

Serial Old 收集器

Serial 收集器的老年代产品。同样是单线程,使用标记整理算法

Parallel Old 收集器

Parallel Old 是 Parallel Scanvenge 的老年代版本,使用多线程标记整理算法

CMS 收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。

从名称是上看出 CMS 采用的是标记清除算法。整个过程有四个步骤:

  • 初始标记(CMS initial mark):仅仅标记一下 GC Roots 能关联到的对象,速度很快。
  • 并发标记(CMS concurrent mark):GC Roots Tracing 过程。
  • 重新标记(CMS remark):修正并发标记期间引用变化那一部分对象
  • 并发清除(CMS concurrent sweep)

其中,初始标记、重新标记需要“Stop The World”。并发标记和并发清除时收集器线程可以与用户线程一起工作。

优势

并发收集、低停顿。

缺陷

  • 对 CPU 资源敏感。多线程导致占用一部分 CPU 资源而导致应用程序变慢。
  • 无法处理浮动垃圾。并发清理过程中用户线程还在运行,会产生新的垃圾,CMS 无法在当次收集中处理它们,只好等待下一次 GC 时再清理掉。这一部分垃圾称为浮动垃圾。
  • CMS 采取的标记清除算法会产生大量空间碎片。往往出现老年代空间剩余,但无法找到足够大连续空间来分配当前对象,不得不提前触发一次 Full GC。

G1收集器

Region

上述的 GC 收集器将连续的内存空间划分为新生代、老生代和永久代(JDK 8 去除了永久代,引入了元空间 Metaspace),这种划分的特点是各代的存储地址(逻辑地址)是连续的。

G1 (Garbage First) 的各代存储地址是不连续的,每一代都使用了 n 个不连续的大小相同的 region, 每个 region 占有一块连续的虚拟内存地址。

G1 跟踪各个 Region 里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。

避免全堆扫描

多个 Region 之前的对象可能会有引用关系,在做可达性分析时需要扫描整个堆才能保证准确性,这显然降低了 GC 效率。

为避免全堆扫描,虚拟机为 G1 中每个 Region 维护了一个与之对应的 Remembered Set。虚拟机发现程序在对Reference类型的数据进行写操作时,会产生一个Write Barrier 暂时中断写操作,检查 Reference 引用的对象是否处于不同的 Region 之中(在分代的例子中就是检查是否老年代中的对象引用了新生代中的对象),如果是,便通过 CardTable 把相关引用信息记录到被引用对象所属的Region的 Remembered Set 之中。当进行内存回收时,在GC根节点的枚举范围中加入 Remembered Set 即可保证不对全堆扫描也不会有遗漏。

G1 的运作步骤

  • 初始标记(Initial Marking)
  • 并发标记(Concurrent Marking)
  • 最终标记(Final Marking)
  • 筛选回收(Live Data Counting and Evacuation)

特点:

  • 空间整合:整体来看是基于“标记 - 整理”算法实现的收集器,从局部(两个 Region 之间)上来看是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。
  • 可预测的停顿:能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在 GC 上的时间不得超过 N 毫秒。

总结

收集器

串行、并行or并发

新生代/老年代

算法

目标

适用场景

Serial

串行

新生代

复制算法

响应速度优先

单CPU环境下的Client模式

Serial Old

串行

老年代

标记-整理

响应速度优先

单CPU环境下的Client模式、CMS的后备预案

ParNew

并行

新生代

复制算法

响应速度优先

多CPU环境时在Server模式下与CMS配合

Parallel Scavenge

并行

新生代

复制算法

吞吐量优先

在后台运算而不需要太多交互的任务

Parallel Old

并行

老年代

标记-整理

吞吐量优先

在后台运算而不需要太多交互的任务

CMS

并发

老年代

标记-清除

响应速度优先

集中在互联网站或B/S系统服务端上的Java应用

G1

并发

both

标记-整理+复制算法

响应速度优先

面向服务端应用

参考资料

深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

深入理解JVM(3)——7种垃圾收集器

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JaqenTalk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM垃圾收集器总结
1、是一个单线程的收集器,“Stop The World” 2、对于运行在Client模式下的虚拟机来说是一个很好的选择 4、简单而高效
神秘的寇先森
2019/04/17
3990
JVM垃圾收集器总结
JVM学习记录-垃圾收集器
先回顾一下上一篇介绍的JVM中常见几种垃圾收集算法: 标记-清除算法(Mark-Sweep)。 复制算法(Copying)。 标记整理算法(Mark-Compact)。 分代收集算法(Generati
纪莫
2018/07/06
3630
HotSpot 提供的垃圾收集器
在之前的文章中,我们介绍了 java 虚拟机内存回收的基本算法和原理,本文中,我们着重介绍一下包含在 jdk1,7 以后的 HotSpot 虚拟机中的垃圾收集器。
用户3147702
2022/06/27
3220
HotSpot 提供的垃圾收集器
JVM:垃圾收集器
如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。
HLee
2021/02/24
3530
JVM:垃圾收集器
jvm系列(三):GC算法 垃圾收集器
概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的. 对象存活判断 判断对象是否存活一般有两种方式: 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加
纯洁的微笑
2018/04/19
6740
jvm系列(三):GC算法 垃圾收集器
深入理解JVM(五)——HotSpot垃圾收集器详解
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器。我们可以根据自己实际的应用需求选择最适合的垃圾收集器。 根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率。 新生代垃圾收集器 1. Serial垃圾收集器 单线程 只开启一条GC线程进行垃圾回收,并且在垃圾回收过程中停止一切用户线程,从而用户的请求或图形化界面会出现卡顿。 适合客户端应用 一般客户端应用所需内存较小,不会创建太多的对象,而且堆
大闲人柴毛毛
2018/03/09
9430
垃圾收集器
HotSpot按照分代收集,所以在不同代上产生了多种不同的收集器,随着时间的推移,有些已经弃用,有些已经成为经典,还有目前广泛使用的,如图1-19所示就是7个经典的垃圾收集器,其中G1是目前应用最为广泛的,还有一些是JDK8以上支持的垃圾收集器,图中并未展示,后面小结中会提到。
胖虎
2020/11/24
4090
垃圾收集器
JVM学习笔记——垃圾收集器与内存分配策略(2)
java虚拟机规范中并没有对垃圾收集器如何实现有任何规定,因此,不同的厂商,不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,这里只讨论基于JDK1.7之后的HotSpot虚拟机。这个虚拟机包括的收集器如下图所示:
用户1665735
2019/02/19
5160
JVM之垃圾收集器
因为新生代和老年代采用回收算法的不同,垃圾收集器相应地也分为新生代收集器和老年代收集器。其中新生代收集器主要有Serial收集器、ParNew收集器和Parallel Scavenge收集器。老年代收集器主要有Serial Old收集器、Parallel Old收集器和CMS收集器。当然还包括了一款全新的、新生代老年代通用的G1收集器。各款收集器的搭配使用如下图所示,其中有连线的代表收集器可以搭配使用,没有连线的收集器表示不能搭配使用。
黑洞代码
2021/01/14
4480
JVM之垃圾收集器
JVM:这是一份全面 & 详细的 常见垃圾收集器 汇总攻略
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Carson.Ho
2019/10/25
3660
JVM中各个垃圾收集器的使用场景
在以往的文章中(垃圾收集算法),我们讲述了JVM中垃圾收集算法,像标记-清除、标记-整理、复制、分代等算法,这些只是垃圾收集的方法论,今天要介绍的就是垃圾收集的具体实现---垃圾收集器。
用户1212940
2022/04/13
3580
JVM中各个垃圾收集器的使用场景
JVM 系列(5) —— 垃圾收集器
这三个指标也被称为不可能的三角,即无法做到三者间的,随着硬件性能的提升,人们反而可以容忍内存占用的扩大,对延迟的容忍度反而降低。
求和小熊猫
2020/12/29
3160
JVM垃圾收集—垃圾收集器及常见组合参数
串行收集器 Serial 和 Serial Old 只能有一个垃圾回收线程执行,用户线程暂停。(适用于内存较小的嵌入式设备)
向着百万年薪努力的小赵
2022/12/02
6360
JVM垃圾收集—垃圾收集器及常见组合参数
【JVM进阶之路】七:垃圾收集器盘点
在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法。接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的实现。
三分恶
2021/04/01
6450
【JVM进阶之路】七:垃圾收集器盘点
JVM垃圾收集器(GC)有哪些?
对于jvm来说垃圾是指运行程序中没有任何指针指向的对象,这个对象就需要被回收。
逍遥壮士
2021/07/05
8360
JVM垃圾收集器(GC)有哪些?
JVM之垃圾回收-垃圾收集器
如果说前面介绍的收集算法(JVM之垃圾回收-垃圾收集算法)是内存回收的抽象策略,那么垃圾收集器就是内存回收的具体实现。
谙忆
2021/01/21
5880
JVM之垃圾回收-垃圾收集器
几个经典的垃圾收集器
Serial是一个新生代单线程收集器,在收集的时候会Stop The World!,也就是停止一切用户工作的线程。 新生代采用标记-复制算法来清理垃圾。 老年代(SerialOld)采用标记-整理来清理垃圾。 优点:
SakuraTears
2022/01/13
4660
几个经典的垃圾收集器
HotSpot垃圾收集器1 Serial垃圾收集器2 ParNew垃圾收集器3 Parallel Scavenge垃圾收集器老年代垃圾收集器1 Serial Old垃圾收集器2 Parallel Ol
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器 根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率.
JavaEdge
2018/05/16
9790
GC算法和垃圾收集器
垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)、
leobhao
2022/06/28
3850
GC算法和垃圾收集器
Hotspot垃圾收集器大全
上篇文章我们介绍了如何判断对象是否为垃圾,有垃圾就要清理,清理就需要 垃圾收集器。
索码理
2022/12/28
4030
Hotspot垃圾收集器大全
相关推荐
JVM垃圾收集器总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文