JVM 有哪些垃圾回收器?

JVM 有哪些垃圾回收器?

图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。

新生代收集器(全部的都是复制算法):Serial、ParNew、ParallelScavenge

老年代收集器:CMS(标记-清理)、Serial Old(标记-整理)、Parallel Old(标记整理)

整堆收集器: G1(一个Region中是标记-清除算法,2个Region之间是复制算法) 同时,先解释几个名词:

  • 并行(Parallel):多个垃圾收集线程并行工作,此时用户线程处于等待状态
  • 并发(Concurrent):用户线程和垃圾收集线程同时执行
  • 吞吐量:运行用户代码时间/(运行用户代码时间+垃圾回收时间)

1.Serial收集器

Serial收集器是Java虚拟机中的一种垃圾收集器,它主要用于收集年轻代中的垃圾对象。它是一种单线程的垃圾收集器,它会暂停应用程序的执行,然后扫描年轻代中的对象,将不再被引用的对象标记为垃圾对象,并将它们回收。

Serial收集器的优点是简单,适用于单核处理器和小内存环境下的应用程序。但是,由于它是单线程的,所以它的垃圾收集效率较低,会导致应用程序的停顿时间较长。

在Java虚拟机中,可以通过设置参数来选择使用Serial收集器。例如,可以使用以下命令行参数来启用Serial收集器:

-XX:+UseSerialGC

此外,还可以通过设置以下参数来调整Serial收集器的行为:

-XX:NewRatio:设置年轻代和年老代的比例,默认值为2,表示年轻代占堆内存的1/3。

-XX:SurvivorRatio:设置Eden区和Survivor区的比例,默认值为8,表示Eden区占年轻代内存的8/10,Survivor区占年轻代内存的1/10。

-XX:MaxTenuringThreshold:设置对象进入年老代的年龄阈值,默认值为15,表示对象在年轻代中经过15次Minor GC后,会被移到年老代中。

2.ParNew收集器

ParNew收集器是一种年轻代垃圾收集器,它是Serial收集器的多线程版本。与Serial收集器类似,ParNew收集器也是使用标记-复制算法来回收年轻代中的垃圾对象,但它可以使用多线程来加速垃圾收集的过程。

ParNew收集器的优点是可以利用多核处理器的优势,提高垃圾收集效率,并且可以通过设置参数来控制线程数,以适应不同的硬件环境。此外,它还可以与CMS收集器配合使用,提供更高效的垃圾收集能力。

在Java虚拟机中,可以通过以下命令行参数来启用ParNew收集器:

-XX:+UseParNewGC

此外,还可以通过设置以下参数来调整ParNew收集器的行为:

-XX:ParallelGCThreads:设置垃圾收集的线程数,默认值为CPU核心数。

-XX:MaxTenuringThreshold:设置对象进入年老代的年龄阈值,默认值为15。

-XX:SurvivorRatio:设置Eden区和Survivor区的比例,默认值为8,表示Eden区占年轻代内存的8/10,Survivor区占年轻代内存的1/10。

总之,ParNew收集器是一种高效的年轻代垃圾收集器,可以在多核处理器上发挥优势,提供更快速的垃圾收集能力。

3.Parallel Scavenge 收集器

Parallel Scavenge收集器是一种年轻代垃圾收集器,它是一种多线程的收集器,与ParNew收集器类似,它也是使用标记-复制算法来回收年轻代中的垃圾对象。

Parallel Scavenge收集器的主要特点是注重吞吐量,即在尽可能短的时间内完成垃圾收集,以最大化应用程序的运行时间。它可以通过控制垃圾收集线程的数量和优先级来实现高吞吐量的垃圾收集。

与其他收集器不同,Parallel Scavenge收集器的目标是达到一个可控制的吞吐量,而不是尽可能减少停顿时间。因此,它的停顿时间可能会比其他收集器长一些,但是它可以在更短的时间内完成垃圾收集,从而提高应用程序的吞吐量。

在Java虚拟机中,可以通过以下命令行参数来启用Parallel Scavenge收集器:

-XX:+UseParallelGC

此外,还可以通过设置以下参数来调整Parallel Scavenge收集器的行为:

-XX:ParallelGCThreads:设置垃圾收集的线程数,默认值为CPU核心数。

-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间,默认值为200毫秒。

-XX:GCTimeRatio:设置垃圾收集时间占总时间的比例,默认值为99,表示垃圾收集时间占总时间的1%。

总之,Parallel Scavenge收集器是一种注重吞吐量的垃圾收集器,可以在多核处理器上发挥优势,提供更高的应用程序吞吐量。

4.Serial Old收集器

在Java虚拟机中,Serial Old收集器是一种传统的、单线程的垃圾收集器,它主要用于收集老年代的垃圾对象。它采用标记-清除算法,首先标记有用的对象,然后清除其他没用的对象,释放内存空间。

Serial Old收集器的优点是简单、高效,适用于小型应用程序和客户端应用程序。但是,它的缺点是无法充分利用多核CPU的优势,因为它是单线程的,不能并行处理垃圾回收任务。此外,它会导致应用程序暂停,因为在垃圾回收期间,应用程序必须等待垃圾回收完成,才能继续执行。

在Java 8之前,Serial Old收集器是默认的老年代收集器。但是,随着Java虚拟机的不断发展,现在更多的应用程序使用并发收集器或G1收集器来管理垃圾对象。

5.Parallel Old收集器

Parallel Old收集器是Java虚拟机中的一种并行垃圾收集器,它主要用于收集老年代的垃圾对象。与Serial Old收集器不同,Parallel Old收集器可以利用多核CPU的优势,使用多线程并行处理垃圾回收任务,从而提高垃圾回收的效率。

Parallel Old收集器采用标记-整理算法,首先标记需要回收的对象,然后将存活的对象移动到一端,然后清理另一端的对象,释放内存空间。由于采用了并行处理,Parallel Old收集器可以在短时间内完成垃圾回收任务,减少应用程序暂停的时间。

Parallel Old收集器适用于大型应用程序和服务器应用程序,可以在多核CPU上充分利用并行处理的优势。但是,它的缺点是在垃圾回收期间,会占用大量的CPU资源,可能会影响应用程序的性能。此外,它也可能会导致应用程序暂停,因为在垃圾回收期间,应用程序必须等待垃圾回收完成,才能继续执行。

6.CMS收集器

CMS收集器是Java虚拟机中的一种并发垃圾收集器,它主要用于收集老年代的垃圾对象。与Parallel Old收集器不同,CMS收集器可以在应用程序运行的同时进行垃圾回收,减少应用程序暂停的时间。

CMS收集器采用标记-清除算法,首先标记需要回收的对象,然后清除这些对象,释放内存空间。由于采用了并发处理,CMS收集器可以在应用程序运行的同时进行垃圾回收,减少应用程序暂停的时间。

CMS收集器适用于大型应用程序和服务器应用程序,可以在应用程序运行的同时进行垃圾回收,减少应用程序暂停的时间。但是,它的缺点是在垃圾回收期间,会占用一定的CPU资源,可能会影响应用程序的性能。此外,由于采用了标记-清除算法,CMS收集器可能会导致内存碎片问题,需要进行额外的处理来解决。

8.G1收集器

G1收集器是Java虚拟机中的一种并发垃圾收集器,它主要用于收集堆内存中的垃圾对象。与CMS收集器不同,G1收集器可以在应用程序运行的同时进行垃圾回收,减少应用程序暂停的时间。

G1收集器采用分代收集的思想,将堆内存分为多个小块,每个小块称为一个区域。它采用标记-整理算法,在每个区域内进行垃圾回收,然后将存活的对象复制到另一个区域。由于采用了并发处理和分代收集的思想,G1收集器可以在应用程序运行的同时进行垃圾回收,减少应用程序暂停的时间。

G1收集器适用于大型应用程序和服务器应用程序,可以在应用程序运行的同时进行垃圾回收,减少应用程序暂停的时间。它还可以根据应用程序的需求动态调整垃圾回收的时间和区域大小,以达到最优的性能。但是,它的缺点是在垃圾回收期间,会占用一定的CPU资源,可能会影响应用程序的性能。此外,由于采用了标记-整理算法,G1收集器不会产生内存碎片问题。

关于gc的选择

除非应用程序有非常严格的暂停时间要求,否则请先运行应用程序并允许VM选择收集器(如果没有特别 要求。使用JVM提供给的默认gc就好)。 如有必要,调整堆大小以提高性能。 如果性能仍然不能满足目标,请使用以下准则作为选择收集器的起点:

  1. 如果应用程序的数据集较小(最大约100 MB),则选择带有选项-XX:+ UseSerialgc的串行收集器。
  2. 如果应用程序将在单个处理器上运行,并且没有暂停时间要求,则选择带有选项-XX:+UseSerialgc的串行收集器。
  3. 如果(a)峰值应用程序性能是第一要务,并且(b)没有暂停时间要求或可接受一秒或更长时间的暂停,则让VM选择收集器或使用-XX:+ UseParallelgc选择并行收集器
  4. 如果响应时间比整体吞吐量更重要,并且垃圾收集暂停时间必须保持在大约一秒钟以内,则选择具有-XX:+ UseG1gc。(值得注意的是JDK9中CMS已经被Deprecated,不可使用!移除该选项)
  5. 如果使用的是jdk8,并且堆内存达到了16G,那么推荐使用G1收集器,来控制每次垃圾收集的时间。
  6. 如果响应时间是高优先级,或使用的堆非常大,请使用-XX:UseZgc选择完全并发的收集器。(值得注意的是JDK11开始可以启动Zgc,但是此时Zgc具有实验性质,在JDK15中[202009发布]才取消实验性质的标签,可以直接显示启用,但是JDK15默认gc仍然是G1)
  7. 这些准则仅提供选择收集器的起点,因为性能取决于堆的大小,应用程序维护的实时数据量以及可用处 理器的数量和速度。
  8. 如果推荐的收集器没有达到所需的性能,则首先尝试调整堆和新生代大小以达到所需的目标。
  9. 如果性能 仍然不足,尝试使用其他收集器

总体原则:减少STOP THE WORD时间,使用并发收集器(比如CMS+ParNew,G1)来减少暂停时间, 加快响应时间,并使用并行收集器来增加多处理器硬件上的总体吞吐量。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wps题注为表格或图片编号

word中为表格添加题注: 问题:多次或多人编辑导致--序号不能联动更新(域代码不一致,如图) 所以是否可以批量替换word里的域代码?如果可以这问题就解决了————失败 解决办法: 如图,复制表头&…

协处理器+流水线 (9)

3级流水线 流程: 取指令 译码 执行。 每一个时钟周期都可以执行一个指令。 提高CPU的能力有两种方法, 1 提高时钟频率,造成单位时间内执行的指令更多。 2 减少每条指令的平均指令周期数CPI ,CPI我不太懂,但大概的…

2024.8.21 作业

一个服务器和两个客户端聊天 代码&#xff1a; /*******************************************/ 文件名&#xff1a;server.c /*******************************************/ #include <myhead.h> #define SER_IP "192.168.2.7" // 服务器IP #define SER…

C#开发基础之100个常用的C#正则表达式

前言 正则表达式是处理字符串的强大工具&#xff0c;特别是在文本搜索、替换和验证中。本文将100个常用的C#正则表达式进行分类&#xff0c;以帮助我们更快速地找到适合的正则表达式解决方案。 1. 基础匹配 这些正则表达式用于匹配一些基本的字符或字符串模式。 匹配任意字…

Linux信号机制探析--信号的产生

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;信号什么是信号&#xff1f;为什么要有信号&#xff1f;查看Linux系统中信号 &#x1f388;信号产生&#x1f4d5;kill…

【计算机网络】网络版本计算器

此前我们关于TCP协议一直写的都是直接recv或者read&#xff0c;有了字节流的概念后&#xff0c;我们知道这样直接读可能会出错&#xff0c;所以我们如何进行分割完整报文&#xff1f;这就需要报头来解决了&#xff01; 但当前我们先不谈这个话题&#xff0c;先从头开始。 将会…

Kubectl命令、初识pod、namespace

文章目录 一、Kubectl简介基础命令1.基本信息命令2.创建和更新资源命令3.删除资源命令4. 查看日志和调试命令5. 端口转发和复制文件命令6. 部署管理命令7. 伸缩命令8. 配置和上下文管理命令9.常用命令 二、Pod简介核心概念pod常见状态调度和初始化阶段容器创建和运行阶段异常状…

Zookeeper服务注册及心跳机制详解

ZooKeeper提供了一种类似于文件目录的结构来保存key值&#xff0c;其提供了四种key类型&#xff0c;分别是持久节点&#xff0c;临时节点&#xff0c;持久有序节点&#xff0c;临时有序节点。其中临时节点的特性是当创建此节点的会话断开时&#xff0c;节点也会被删除。这一特性…

Apache Commons-IO 库

Apache Commons-IO是Apache开源基金组织提供的一组有关IO&#xff08;Input/Output&#xff09;操作的小框架。这个库的主要目的是为了提高IO流的开发效率&#xff0c;减少在进行文件读写、目录遍历等操作时编写的样板代码量。通过使用Commons-IO库&#xff0c;开发者可以更加简…

WT32-ETH01开发板模块,启明云端物联网方案,乐鑫ESP32多样化开发应用

在物联网(IoT)的浪潮中&#xff0c;无线Wi-Fi模块作为连接传统硬件与现代智能网络的桥梁&#xff0c;正逐渐成为智能家居和设备通信不可或缺的一部分。Wi-Fi模块也被称为串口Wi-Fi模块&#xff0c;是一种嵌入式模块&#xff0c;它能够将串口或TTL电平信号转换为符合Wi-Fi无线网…

关于AR在医疗领域创新应用

AR技术在医疗领域创新应用&#xff0c;旨在展示AR技术如何为医疗行业带来革命性的变化&#xff0c;我们可以从以下几个方面入手&#xff1a; 一、引言 随着科技的飞速发展&#xff0c;增强现实&#xff08;AR&#xff09;技术正逐步渗透到医疗领域的各个环节&#xff0c;为患…

蓝桥杯2021第十二届蓝桥杯青少年组省赛试题真题

带我去看题解&#xff01;&#xff01;&#xff01; 带我去看题单&#xff01;&#xff01;&#xff01; 目录 第一题&#xff1a;[2021第十二届蓝桥杯青少年组省赛] 字符串 题目背景 题目描述 输入格式 输出格式 输入输出样例 第二题&#xff1a;[2021第十二届蓝桥杯…

【Docker】安装Docker环境遇到的坑(VirtualBox)

利用vagrant工具在VirtualBox安装CentOS7环境后&#xff0c;安装Docker环境遇到的坑 前期准备工作 1、卸载原有环境 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engi…

Spire.PDF for .NET【文档操作】演示:创建 PDF 组合

PDF 作品集是一组文件&#xff0c;其中可以包含文本文档、电子表格、电子邮件、图像、PowerPoint 演示文稿和绘图。尽管 PDF 作品集将不同类型的文件组合成一个单元&#xff0c;但其中的每个文件都保留了其原始格式、分辨率和大小。在本文中&#xff0c;您将学习如何使用Spire.…

C#实现数据采集系统-多设备采集

系统功能升级-多设备采集 数据采集系统在网络环境下&#xff0c;性能足够&#xff0c;可以实现1对多采集&#xff0c;需要支持多个设备进行同时采集功能&#xff0c;现在就开发多设备采集功能 修改多设备配置 设备配置 将DeviceLink 改成List集合的DeviceLinks删掉Points&a…

datawind可视化查询-其他函数

飞书文档学习链接:https://www.volcengine.com/docs/4726/47275 1. 用户名函数 用户名函数并非 ClickHouse 官方函数,而是与项目用户信息相结合,用于返回当前使用用户的指定信息的函数。 USERNAME()可返回当前用户的用户名,如下所示。该函数也可与其他函数组合使用 2. J…

Android 应用集成百度地图定位SDK

在当今的移动互联网时代&#xff0c;位置服务已经成为了众多应用不可或缺的功能之一。无论是社交应用中的位置分享&#xff0c;还是服务类应用中的位置导航&#xff0c;都离不开精准的定位技术。为了满足这一需求&#xff0c;越来越多的开发者选择集成第三方的定位SDK。其中&am…

【ARM Hypervisor And SMMU 系列 5 -- SMMU 和 IOMMU技术】

文章目录 SMMU 和 IOMMU技术ARM 的 SMMUTranslation process overviewTBU 和 TCU 的关系TBUTCUTLBSMMU 和 IOMMU技术 文章 讲到了为支持I/O透传机制中的DMA设备传输而引入的IOMMU/SMMU技术,同时留了一个问题:IOMMU/SMMU是否可以同时支持GVA->GPA和GPA->HPA的转换? 答案…

三种相机模型总结(针孔、鱼眼、全景)

相机标定 文章目录 相机标定前言 前言 我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出 参考链接 https://zhuanlan.zhihu.com/p/540969207 相机标定之张正友标定法数学原理详解&#xff08;含python源码&a…