当前版本的HotSpot JVM包括三种类型的垃圾收集器:

–串行收集器

–并行收集器

–多数同时收集者

它们都是世代的,这意味着它们利用了堆的划分方式 。

垃圾收集器负责三个主要操作:

–查找不再使用的对象

–释放这些对象之后的内存

–压缩堆

并非所有收集器都以相同的方式执行这些操作,因此让我们了解有关所有收集器的基本信息。 我们将在单独的文章中介绍细节。

串行收集器

顾名思义,该收集仅由一个线程执行。 在次要和完全GC期间都必须停止世界(STW)。

该收集器对年轻一代使用标记复制算法,而对老一代则使用标记清除紧凑算法进行清理。

串行GC专为单线程环境(通常是客户端类计算机)和较小的堆而设计。 可以通过-XX:+UseSerialGC标志启用它。

并行(吞吐量)收集器

Young集合由多个线程并行化,这使Minor GC更快。 结果,此收集器导致较短但更频繁的Young收集STW暂停。 从JDK 7u4开始,默认情况下还会由多个线程收集“旧世代”(并且还会导致世界停顿)。 在JDK 7u4之前,需要-XX:+UseParallelOldGC标志来启用旧一代的并行处理。 现在, -XX:+UseParallelGC-XX:+UseParallelOldGC标志都启用了吞吐量收集器,并同时处理了老一代和年轻一代。

该收集器还在Young Generation中使用mark-copy算法,在Old Generation中使用mark-sweep-compact,但是复制和压缩阶段均由多个线程执行。

要配置GC线程数,可以使用-XX:ParallelGCThreads=X标志。 默认值设置为CPU内核数。

什么时候使用并行GC是个不错的选择? 好吧,基本上,只要吞吐量比延迟更重要。

大多数同时收集者

它们被称为低暂停收集器-旨在最大程度地减少停顿的暂停并保持应用程序尽可能的响应

并发标记和扫描(CMS)

使用并行标记复制算法在多个线程中执行次要GC。 然后将停止所有应用程序线程。 老式服务器通常是同时收集的-当后台GC线程扫描老式服务器时,应用程序线程会暂停很短的时间。 Major GC期间使用的实际算法是并发标记扫描。 您可能已经注意到,“扫描”之后没有“压缩”。 没错–并发标记和清除是不会压缩使用权空间的收集器,因此内存可能会碎片化。 由于缺乏堆压缩,当GC无法将新对象放入内存时,JVM会回退到串行mark-sweep-compact算法以对旧一代进行碎片整理和压缩。 那就是性能下降的时候–所有应用程序线程都停止了,只有一个线程负责清理和压缩Tenured空间。

如前所述,CMS是低暂停收集器的一个示例。 这意味着当延迟是主要目标而不是吞吐量时,这是一个不错的选择-因为吞吐量可能由于CPU消耗的增加而降低(在应用程序线程运行时扫描堆不是免费的)。

-XX:+UseConcMarkSweepGC启用CMS收集器。 过去可以使用-XX:-UseParNewGC (单号“ UseParNewGC”之前的负号,因此使用此标志将禁用Parallel New(Young)GC)来配置具有单线程Young Generation集合的CMS,但已弃用在Java 8中已删除,在Java 9中已删除。

G1GC

垃圾优先(G1)是一种新的低中断垃圾收集器,旨在以最小的暂停处理大型堆。 堆分为固定大小的几个区域(同时仍保持堆的世代性质)。 这种设计使我们可以在处理整个“年轻一代”或“老一代”时摆脱长时间的STW暂停。 现在,可以分别收集每个区域,这将导致STW停顿时间更短但更频繁。 G1将对象从一个区域复制到另一个区域,这意味着堆至少已部分压缩。

G1使用mark-sweep-compact算法的增量版本。 可以通过指定-XX:+UseG1GC标志来启用它。

摘要

这是本文讨论的收集器的简单比较:

集电极 多个GC线程 STW(年轻一代) STW(老一代) 堆压实 首要目标
序列号 没有
平行 通量
内容管理系统 仅在扫描期间 没有 潜伏
G1 很短的 部分地 潜伏

还有一些其他垃圾收集器,但它们不是HotSpot JVM的一部分。 这些是:

  • C4(Azul Zing JVM)
  • 雪兰多
  • 平衡(IBM J9 JVM)

在Java 8中,服务器级计算机的默认GC是Parallel Collector。 G1GC在Java 9中将是默认的。默认情况下,客户端类计算机运行Serial Collector。

翻译自: https://www.javacodegeeks.com/2017/09/gc-explained-collectors-overview.html

GC解释:收集器概述相关推荐

  1. gc垃圾收集器 与gc算法_GC解释:收集器概述

    gc垃圾收集器 与gc算法 当前版本的HotSpot JVM包括三种类型的垃圾收集器: –串行收集器 –并行收集器 –多数同时收集者 它们都是世代的,这意味着它们利用了堆的划分方式 . 垃圾收集器负责 ...

  2. CoreCLR源码探索(四) GC内存收集器的内部实现 分析篇

    在这篇中我将讲述GC Collector内部的实现, 这是CoreCLR中除了JIT以外最复杂部分,下面一些概念目前尚未有公开的文档和书籍讲到. 为了分析这部分我花了一个多月的时间,期间也多次向Cor ...

  3. CoreCLR源码探索(五) GC内存收集器的内部实现 调试篇

    在上一篇中我分析了CoreCLR中GC的内部处理, 在这一篇我将使用LLDB实际跟踪CoreCLR中GC,关于如何使用LLDB调试CoreCLR的介绍可以看: 微软官方的文档,地址 我在第3篇中的介绍 ...

  4. (七)JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC日志剖析

    引言 在<GC基础篇>中曾谈到过分代以及分区回收的概念,但基础篇更多的是建立在GC的一些算法理论上进行高谈阔论,而本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器.并行收 ...

  5. 26 Java GC算法 垃圾收集器、标记 -清除算法、复制算法、标记-压缩算法、分代收集算法

    26.Java GC算法 垃圾收集器 1.1.1标记 -清除算法 1.1.2复制算法 1.1.3标记-压缩算法 1.1.4分代收集算法 26.Java GC算法 垃圾收集器 概述 垃圾收集 Garba ...

  6. JVM--垃圾收集器与内存分配策略

    1.概述 垃圾回收器的历史比Java久远,诞生于Lisp(第一门开始使用内存动态分配和垃圾收集技术的语言). 2.对象已死? 1.引用计数法 概述:在对象中添加一个引用计数器,每当有一个地方引用它时, ...

  7. JVM---垃圾收集器(万字详解)

    垃圾收集器万字详解 垃圾回收器 垃圾收集器万字详解 前言 垃圾收集器说明与发展史 垃圾收集器简要说明 垃圾收集器发展史 垃圾收集器的分类 衡量垃圾收集器性能的指标 不同的垃圾收集器概述 7款经典的垃圾 ...

  8. 直通BAT必考题系列:深入剖析JVM之G1收集器、及回收流程、与推荐用例

    金三银四马上到了,即将进入面试的高峰期.在BAT面试中,JVM基本都是必考的系列.你至少需要掌握JVM内存模型与JVM参数详细配置,JVM的4种垃圾回收算法.垃圾回收机制与总结,以及今天重点谈到的JV ...

  9. 垃圾收集器(CMS收集器 , G1收集器…)

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,以下讲 ...

最新文章

  1. wxWidgets:wxBitmapComboBox类用法
  2. Polly 重试策略
  3. Python BaseHTTPServer 模块解析
  4. 在SAP Cloud Platform ABAP编程环境里打印系统变量
  5. Nginx +Tomcat 实现动静态分离(转)
  6. python连接linux堡垒机_利用Python Paramiko开发linux堡垒机
  7. 使用python连接kafka
  8. wsimport命令讲解
  9. mysql 浮点类型有宽度指示器吗_mysql中的浮点类型
  10. WEB前端开发规范文档示例
  11. 微软Windows字体被诉侵权?我们来聊聊有关网站侵权被诉的那些事。
  12. html autoplay属性,HTML autoplay属性用法及代码示例
  13. 20191019杂谈——祸兮福所倚
  14. 计算机辅助翻译专业院校,中国翻译学专业高校排名
  15. 牛客练习赛66 E-骚区间
  16. 双硬盘+win10+Ubuntu20.04双系统安装安装教程(UEFI)
  17. 计算机的英文怎么说不是computer,【英语写作】“开电脑”可不是“open the computer”,说错了很尴尬!...
  18. reg型和memory型数据
  19. VS Supercharger插件
  20. Python微信公众号开发

热门文章

  1. JVM 调优系列之图解垃圾回收
  2. Java码农必须掌握的循环删除List元素的正确方法
  3. 浅析负载均衡的6种算法,Ngnix的5种算法
  4. Android面试题算法之二叉树
  5. Redis(案例一:注册登录-图形验证码+谷歌开源Kaptcha)
  6. 2014年JAVA省赛B组---第四题---大衍数列
  7. 微内核操作系统能做服务器系统吗,科普:微内核操作系统现状
  8. wxml报错原因_C#生成、解析xml文件以及处理报错原因
  9. 阿卡姆疯人院需要java吗_蝙蝠侠阿甘疯人院 这个报错 怎么解决 哪位大神知道...
  10. sql server 2008安装_性能不够?基于时序数据库的Zabbix 5.2安装指南