JVM专题十一:JVM 中的收集器一

news2024/9/17 8:41:36

上一篇JVM专题十:JVM中的垃圾回收机制专题中,我们主要介绍了Java的垃圾机制,包括垃圾回收基本概念,重点介绍了垃圾回收机制中自动内存管理与垃圾收集算法。如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。本章节就让我具体的垃圾回收器以及他们各自的优缺点,由于垃圾回收器内容比较多,本专题主要讨论分代收集器如:Parallel、ParNew、CMS等,关于G1、ZGC等放到专题十二

简介

如上图所示JVM 的垃圾收集器主要分为两大类:分代收集器分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1 和 ZGC,下面我们来看看各个收集器之间的联系与版本。

Java虚拟机(JVM)中不同版本的垃圾收集器(GC)及其引入的Java Development Kit(JDK)版本的概述。以下是对这些核心内容的整理:

新生代收集器:

  • Serial GC:单线程收集器,适用于JDK 1.3及之前版本,以及小数据量的内存管理。
  • ParNew GC:Serial GC的多线程版本,适用于JDK 1.4及之后版本。
  • Parallel GC:吞吐量优先的多线程收集器,适用于JDK 1.4及之后版本。
  • Epsilon GC:无操作的收集器,用于测试,从JDK 11开始引入。

收集算法:

  • Scavenge:新生代的复制算法,用于Serial和ParNew GC。
  • Copying:复制算法,用于新生代对象的收集。

老年代收集器:

  • Serial Old GC:Serial GC的老年代版本,使用标记-整理算法。
  • Parallel Old GC:Parallel GC的老年代版本,使用多线程标记-整理算法。
  • CMS (Concurrent Mark Sweep) GC:并发标记清除算法,减少停顿时间,从JDK 1.5开始引入。
  • MarkCompact:标记-整理算法,用于CMS和Parallel Old GC。

其他收集器:

  • G1 (Garbage-First) GC:从JDK 1.7开始引入,适用于大堆内存。
  • ZGC:可扩展、低延迟的收集器,从JDK 11开始引入。
  • Shenandoah GC:并发低延迟收集器,从JDK 9开始引入(默认)。

收集器的引入时间线:

  • JDK 1.3:引入Serial Old GC和整体的标记-整理(MSC)算法。
  • JDK 1.4:引入Serial、ParNew、Parallel GC,以及新生代的Scavenge算法。
  • JDK 1.5:引入CMS GC。
  • JDK 1.6:引入Parallel Old GC。
  • JDK 1.7:引入G1 GC。
  • JDK 9:引入Shenandoah GC,并且CMS成为默认的收集器。
  • JDK 11:引入ZGC和Epsilon GC。

上图提供了JVM垃圾收集器随JDK版本演进的概览,展示了不同收集器的特点和它们被引入的时间点。开发者可以根据这些信息,结合自己的应用需求和JDK版本,选择合适的垃圾收集器。

分代收集器

Serial收集器

Serial收集器是Java虚拟机(JVM)中一个非常基础的垃圾收集器,它在JDK 1.3之前是默认的收集器。以下是关于Serial收集器的一些核心信息:

  • 单线程操作:Serial收集器在进行垃圾收集时使用单个线程,这意味着在收集过程中,它不会利用多核处理器的优势。

  • Stop The World:在Serial收集器进行垃圾收集期间,所有的应用线程会被暂停,直到收集完成。这种停顿被称为"Stop The World",可能会对应用程序性能产生影响,尤其是在垃圾收集周期较长时。

  • 新生代收集:Serial收集器在新生代使用复制(Copying)算法,这是一种简单且高效的算法,适用于新生代,因为新生代中的对象大多是朝生夕死。

  • 老年代收集:Serial Old收集器是Serial收集器的老年代版本,对于老年代,Serial收集器使用标记-整理(Mark-Compact)算法。这种算法首先标记存活的对象,然后整理内存,使得所有存活的对象都移动到内存的一端,从而避免内存碎片。它同样是一个单线程收集器。它主要有两大用途:一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,另一种用途是作为CMS收集器的后备方案。

  • 适用场景:Serial收集器主要适用于单核处理器或者小型应用,以及对延迟不敏感的场景。

  • 配置选项:可以通过JVM参数 -XX:+UseSerialGC 来指定使用Serial收集器进行新生代收集,通过 -XX:+UseSerialOldGC 来指定使用Serial Old收集器进行老年代收集。

  • 性能特点:虽然Serial收集器在现代多核处理器上可能不是最高效的选择,但它的简单性和低资源消耗使其在某些特定场景下仍然有用。

  • 与其他收集器的比较:与并行或并发收集器相比,Serial收集器在多核处理器上的性能可能较差,但在单核系统或资源受限的环境中,它可能是一个合适的选择。

总的来说,Serial收集器是一个简单且历史悠久的垃圾收集器,虽然在现代应用中可能不是首选,但在特定的低资源环境中,它仍然有其用武之地。随着JVM的发展,更多的高级收集器被引入,以满足不同应用场景的需求。

Parallel收集器

Parallel收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为控制参数、收集算法、回收策略等等和Serial收集器类似。关于Parallel收集器及其变体的核心信息概述如下:

  • Parallel收集器
    • 多线程:使用多个线程进行垃圾收集。
    • 线程数配置:默认线程数与CPU核心数相同,可通过-XX:ParallelGCThreads指定。
    • 吞吐量优先:专注于高效率利用CPU。
    • 参数调节:提供参数以调整停顿时间或吞吐量。
  • Parallel Old收集器
    • Parallel 老年代版本:使用多线程和标记-整理算法。
  • 收集算法
    • 新生代:复制算法。
    • 老年代:标记-整理算法。
  • JDK默认设置
    • JDK 8:默认使用Parallel Scavenge和Parallel Old。

这些收集器适用于需要高吞吐量的应用,尤其是在多核处理器环境中,通过参数配置可以实现高效的垃圾收集。

ParNew收集器

ParNew收集器作为Serial收集器的多线程版本,与Parallel收集器在很多方面相似,但它们之间存在一些关键的差异和特定的使用场景。以下是ParNew收集器的核心信息:

  • 多线程支持:ParNew收集器使用多个线程进行垃圾收集,与Parallel收集器类似,可以充分利用多核处理器的优势。

  • 与CMS的兼容性:ParNew收集器的主要特点是它可以与CMS(Concurrent Mark Sweep)收集器配合使用。CMS是一种并发收集器,主要关注减少垃圾收集期间的用户线程停顿时间。

  • 新生代收集:ParNew收集器在新生代使用复制算法,这是一种简单且高效的算法,适用于新生代,因为新生代中的对象大多是朝生夕死。

  • Server模式下的默认选择:在Server模式下,ParNew收集器通常是首选,特别是当应用需要与CMS收集器配合工作时。

  • 适用场景:ParNew收集器适用于需要快速响应垃圾收集需求的多核服务器环境,尤其是在与CMS收集器结合使用时,可以提供较低的停顿时间。

  • 配置选项:可以通过JVM参数-XX:+UseParNewGC来指定使用ParNew收集器进行新生代收集。

ParNew收集器的优势在于它能够与CMS收集器协同工作,提供一种平衡吞吐量和停顿时间的解决方案。这种组合特别适合那些需要高吞吐量同时又希望减少垃圾收集引起的停顿的应用场景。然而,开发者需要根据具体的应用需求和性能目标来决定是否使用ParNew与CMS的组合,或者选择其他的垃圾收集器配置。

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以减少垃圾收集(GC)过程中的停顿时间为目标的垃圾收集策略。以下是CMS收集器的详细概述,包括其优点和缺点:

CMS收集器概述:

  • 目标:最小化GC引起的停顿时间,提高用户体验。
  • 并发性:HotSpot虚拟机中第一款实现垃圾收集线程与用户线程并发工作的收集器。

运作过程:

  1. 初始标记:短暂停顿(STW),记录GC Roots直接引用的对象。
  2. 并发标记:遍历对象图,耗时但用户线程不停顿,与GC线程并发运行。
  3. 重新标记:修正并发标记期间由于用户程序运行导致的标记变动,使用增量更新算法。
  4. 并发清理:用户线程开启,GC线程清扫未标记区域,新增对象被标记为黑色。
  5. 并发重置:重置GC过程中的标记数据。

CMS收集器优点:

  • 并发收集:减少GC引起的停顿时间。
  • 低停顿:特别适合注重响应时间的应用。

CMS收集器缺点:

  • CPU资源敏感:GC线程与用户线程竞争CPU资源。
  • 浮动垃圾问题:并发标记和清理阶段产生的垃圾需等到下一次GC处理。
  • 空间碎片:使用“标记-清除”算法可能导致空间碎片,可通过参数-XX:+UseCMSCompactAtFullCollection进行整理。
  • 不确定性:可能发生“concurrent mode failure”,即上一次GC未完成就触发新的GC,此时会使用Serial Old收集器进行回收。

其他注意事项:

  • 参数调整:合理配置JVM参数可以优化CMS收集器的性能。
  • 适用场景:适用于对响应时间要求较高的应用,如Web服务器。

CMS收集器的设计目标是减少GC引起的停顿时间,通过并发执行大部分GC工作来实现这一目标。然而,它也有一些局限性,如对CPU资源的敏感性、浮动垃圾问题和空间碎片问题。开发者需要根据应用的具体需求和运行环境来决定是否使用CMS收集器,并进行适当的参数调整以优化性能。

CMS(Concurrent Mark Sweep)收集器的一些核心参数,它们可以用于调整和优化CMS收集器的行为:

  • -XX:+UseConcMarkSweepGC:启用CMS垃圾收集器。

  • -XX:ConcGCThreads:设置并发GC线程的数量,即在并发标记和并发清理阶段使用的线程数。

  • -XX:+UseCMSCompactAtFullCollection:在Full GC之后执行内存压缩整理,以减少内存碎片。

  • -XX:CMSFullGCsBeforeCompaction:设置在多少次Full GC之后执行一次压缩整理,默认值为0,意味着每次Full GC后都会进行压缩整理。

  • -XX:CMSInitiatingOccupancyFraction:设置老年代占用达到该比例时触发Full GC的阈值,默认为92%。

  • -XX:+UseCMSInitiatingOccupancyOnly:仅使用-XX:CMSInitiatingOccupancyFraction设置的回收阈值。如果不设置此参数,JVM在第一次使用设定值后,后续会根据实际情况自动调整阈值。

  • -XX:+CMSScavengeBeforeRemark:在CMS GC的重新标记阶段前启动一次Minor GC,减少标记阶段的开销。由于CMS GC的大部分耗时通常在标记阶段,此参数可以提高效率。

  • -XX:+CMSParallellnitialMarkEnabled:在初始标记阶段使用多线程执行,以缩短停顿时间。

  • -XX:+CMSParallelRemarkEnabled:在重新标记阶段使用多线程执行,进一步缩短停顿时间。

通过调整这些参数,开发者可以根据应用的具体需求和运行环境来优化CMS收集器的性能。例如,如果应用对停顿时间非常敏感,可以增加并发GC线程数或调整触发Full GC的阈值。如果内存碎片是一个问题,可以启用内存压缩整理。这些参数提供了灵活性,使得CMS收集器可以适应不同的应用场景。

三色标记

三色标记算法是现代垃圾收集器中用于解决并发标记问题的一种算法。以下是三色标记算法的详细解释:

三色标记算法概述:

  • 黑色对象:已被垃圾收集器访问,并且从该对象出发的所有引用都已扫描。黑色对象是安全的,不会指向任何未被访问的白色对象,即它们不会导致漏标。
  • 灰色对象:已被垃圾收集器访问,但从该对象出发的至少有一个引用尚未被扫描。灰色对象作为工作列表的一部分,将被进一步探索。
  • 白色对象:尚未被垃圾收集器访问。在分析开始时,所有对象都是白色的。如果分析结束时对象仍然是白色的,那么它们是不可达的,即可以被回收的垃圾对象。

算法步骤:

  1. 从GC Roots开始,将所有直接可达的对象标记为灰色,并加入工作列表。
  2. 从工作列表中取出灰色对象,扫描它的所有引用,将新发现的未访问对象(白色对象)标记为灰色,并加入工作列表。
  3. 重复步骤2,直到工作列表为空,此时所有可达的对象都已被访问并标记为黑色或灰色。
  4. 如果在并发标记期间对象的引用发生了变化,增量更新算法会修正这些变化,确保不会漏标。

优点:

  • 减少停顿时间:三色标记算法允许垃圾收集器在标记阶段与应用程序并发运行,减少停顿时间。

缺点:

  • 处理并发变动:在并发标记期间,如果对象的引用发生变化,需要特殊处理以避免漏标。

应用:

  • 三色标记算法广泛应用于并发垃圾收集器中,如CMS收集器的并发标记阶段。

增量更新:

  • 在并发标记期间,如果应用程序继续运行,对象的引用可能发生变化。增量更新算法用于处理这些变化,确保标记的准确性。

三色标记算法通过区分已访问和未访问的对象,有效地避免了在并发标记期间由于对象引用变化导致的漏标问题。这种算法是实现低延迟垃圾收集的关键技术之一。

小节

其实章节最最主要的还是要掌握CMS相关知识掉。目前用的最多的就是他了,同时你们也可以看下自己产线用的是什么收集器。和相关参数怎么配置的,为什么这么配置根据是什么。

专题汇总

JVM专题一:深入分析Java工作机制

JVM专题二:Java如何进行编译的

JVM专题三:Java代码如何运行

JVM专题四:JVM的类加载机制

JVM专题五:类加载器与双亲委派机制

JVM专题六:JVM的内存模型

JVM专题七:JVM垃圾回收机制

JVM专题八:JVM如何判断可回收对象

JVM专题九:JVM分代知识点梳理

JVM专题十:JVM中的垃圾回收机制

JVM专题十一:JVM 中的收集器一

JVM专题十二:JVM 中的收集器二

JVM专题十三:总结与整理(面试常用)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1877983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx优势以及应用场景,编译安装和nginx

一. Nginx是什么? 1. Nginx概述 高性能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30,000~50,000个并发请求Nginx(发音同 “engine x”)是一个高性能的反向代理和Web服务器软件&#xff0c…

MySQL之覆盖索引

什么是覆盖索引? 覆盖索引:查询时使用了索引,且需要返回的列,在改索引中已经全部能找到。 示例:有user表如下: CREATE TABLE user (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 技术主键,name varch…

Windows 中的 Hosts 文件是什么?如何找到并修改它?

什么是 Hosts 文件 Hosts 文件是一个纯文本文件,存在于几乎所有的操作系统中,用于将主机名映射到 IP 地址。在域名系统(DNS)尚未普及之前,Hosts 文件是计算机网络中唯一用于主机名解析的方式。随着网络规模的扩大和 D…

GPT-4替代大学生参加考试,94%成功作弊未被发现!

目录 01 「伪装」过程 02 实验结果 03 成绩如何? 调查显示,94%的AI生成内容完全不会被大学教授察觉。 而且在83.4%的情况下,「AI同学」的成绩显著高于人类学生。 看来,AI真的要攻陷人类的考试了。 其实,早在GPT-4发…

【Mybatis】Mybatis初识-通过源码学习执行流程

文章目录 1.Mybatis核心组件1.1 SqlSession1.2 SqlSessionFactory1.3 Mapper1.4 MappedStatement1.5 Executor 2. Mybatis各组件之间关系3. 构建SqlSessionFactory3.1 从XML文件中构建3.2 不使用XML构建SqlSessionFactory 4. 如何从SqlSessionFactory获取SqlSession5.获取Mappe…

STM32CubeMx的学习记录系列(1) - 软件的下载与点灯

目录 因为最近要学STM32的嵌入式AI开发,但它于是基于STM32CubeMX开发的,就顺便把这个学了。 直接百度STM32CubeMX,到意法的官网去下载。下载过程就看这篇博客 https://blog.csdn.net/as480133937/article/details/98885316 点灯 选择芯片&…

PG备份与恢复

一、开启WAL归档 1、创建归档目录 我们除了存储数据目录pgdata之外,还要创建backups,scripts,archive_wals文件 mkdir -p /home/mydba/pgdata/arch mkdir -p /home/mydba/pgdata/scripts mkdir -p /home/mydba/backups chown -R mydba.myd…

PIP一些问题解决办法

研究生期间遇到关于PIP一些问题报错以及解决办法的汇总 pip安装报错:is not a supported wheel on this platform 本节转自 https://blog.csdn.net/happywlg123/article/details/107281936 ​ 出现这个问题,是由于这个whl和系统python版本不匹配导致的。…

数字人解决方案——数字人类不仅仅是长着一张脸的人工智能

数字人类曾经是简单的聊天机器人,经常误解问题,这让许多人感到沮丧。现在,他们已经发展成为先进的虚拟代理,可以像最好的客户服务代表一样有效地沟通,拥有专家级的知识,并且看起来与真人惊人地相似。 这些…

基于协同过滤的电影推荐与大数据分析的可视化系统

基于协同过滤的电影推荐与大数据分析的可视化系统 在大数据时代,数据分析和可视化是从大量数据中提取有价值信息的关键步骤。本文将介绍如何使用Python进行数据爬取,Hive进行数据分析,ECharts进行数据可视化,以及基于协同过滤算法…

<电力行业> - 《第7课:发电》

1 发电的原理 电力生产的发电环节是利用电能生产设备将各种一次能源或其他形式的能转换为电能。生产电能的主要方式有火力发电、水力发电、核能发电、地热发电、风力发电、太阳能发电、潮汐能发电、生物智能发电和燃料电池发电等。 除太阳能发电的光伏电池技术和燃料电池发电…

[单机版架设]新天堂2-死亡骑士338|带AI机器人

前言 今天给大家带来一款单机游戏的架设:新天堂2-死亡骑士338单机服务端—带AI机器人 如今市面上的资源参差不齐,大部分的都不能运行,本人亲自测试,运行视频如下: 新天堂2 搭建教程 此游戏架设不需要虚拟机&#xf…

利用LLM本身训练SoTA embedding模型

今天分享一篇Microsoft公司的一篇文章,Title: Improving Text Embeddings with Large Language Models:使用大语言模型改善文本嵌入。 这篇文章探索了直接利用LLM来做embedding模型,其只需要利用合成数据和少于1000次的训练步骤就能获得高质…

Arthas快速入门

简介 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类…

仓库管理系统12--供应商设置

1、添加供应商窗体 2、布局控件UI <UserControl x:Class"West.StoreMgr.View.SupplierView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://…

什么是机器学习,机器学习与人工智能的区别是什么(一)?

人工智能和计算机游戏领域的先驱阿瑟塞缪尔&#xff08;Arthur Samuel&#xff09;创造了 "机器学习"一词。他将机器学习定义为 “一个让计算机无需明确编程即可学习的研究领域” 。通俗地说&#xff0c;机器学习&#xff08;ML&#xff09;可以解释为根据计算机的经…

前端学习笔记(2406261):jquery使用checkbox控制页面自动刷新

文章目录 需求登录页面主页面 API用户登录login获取数据getdata 代码登录页面主页面 关于后端 需求 这是一个物联网的演示项目&#xff0c;web端能够实时显示后台数据的变化&#xff0c;其流程非常简单&#xff1a; 用户登录登录成功后显示主界面面主界面进入后自动显示数据数…

Java中的Checked Exception和Unchecked Exception的区别

在Java中&#xff0c;异常分为两大类&#xff1a;已检查异常&#xff08;Checked Exception&#xff09;和未检查异常&#xff08;Unchecked Exception&#xff09;。 已检查异常是在编译时必须被捕获或声明的异常。换句话说&#xff0c;如果你的方法可能会抛出某个已检查异常&…

古人的智慧结晶——水铳:揭秘明清时期的消防神器

明代的《奇器图说》是一本记录了当时各种奇巧机械的著作&#xff0c;而水铳则是书中记载的一项令人惊叹的发明&#xff0c;它不仅展示了古人对物理原理的深刻理解&#xff0c;更是早期消防技术的一个缩影。 水铳&#xff0c;这个名字听起来似乎有些陌生&#xff0c;但在古代&am…

Kafka~消息发送过程与ISR机制了解

消息发送过程 使用Kafka发送消息时&#xff0c;一般有两种方式分别是&#xff1a; 同步发送异步发送 同步发送时&#xff0c;可以在发送消息后&#xff0c;通过get方法等待消息结果&#xff0c;这种情况能够准确的拿到消息最终的发送结果&#xff0c;要么是成功、要么是失败…