JVM 有哪些垃圾回收器?

news2025/4/18 9:58:58

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.coloradmin.cn/o/2061640.html

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

相关文章

使用 Charles 模拟手机弱网测试

在移动互联网时代,网络状况的不确定性给应用程序带来了挑战。尤其是在偏远地区或信号不佳的地方,用户的网络连接可能会变得不稳定。因此,对应用程序进行弱网测试变得尤为重要。Charles Proxy 是一款广泛使用的网络调试工具,它不仅…

分享小诗梦404炫酷单页面html5源码

源码介绍 分享小诗梦404炫酷单页面html5源码,小诗梦的一个很炫酷页面,感觉应该符合一些人的感觉!可以用来做404页面。 源码下载 分享小诗梦404炫酷单页面html5源码

C++ | Leetcode C++题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {int ans INT_MIN;int m matrix.size(), n matrix[0].size();for (int i 0; i < m; i) { // 枚举上边界vector<int> sum(…

SAP凭证分割【Document Splitting】

在SAP系统中&#xff0c;凭证分割&#xff08;Document Splitting&#xff09;是一种用于在财务会计模块中特别是总帐会计中进行更细粒度的财务报表分析的技术。通过凭证分割&#xff0c;可以按照不同的标准&#xff08;如成本中心、利润中心、公司代码等&#xff09;对会计凭证…

C语言 | Leetcode C语言题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; int maxSumSubmatrix(int** matrix, int matrixSize, int* matrixColSize, int k){int preSum[matrixSize][*matrixColSize];for(int i0; i<matrixSize; i){preSum[i][0] matrix[i][0];}for(int i0; i<matrixSize; i){for(int j1; j…

Funsound语音识别技术之 语音识别多路并发转写

免费语音识别转写&#xff08;优于讯飞&#xff09;&#xff1a;www.funsound.cn Funsound语音识别工具包&#xff1a;https://github.com/pika-online/Funsound/tree/main 1. 前言 本文主要介绍一种简单的多路语音识别转写部署方案&#xff0c;基于多线程开发实现后台同时转…

總結熱力學_2

個人近況 在考慮廷畢的選課情況&#xff0c;以及更改教資的科目三&#xff1a;比如由物理改為音樂 在看<<怪談直播間>>&#xff0c;顧毅的第五關太長了... <<詭舍>>不知道&#xff0c;三下鄉完了就没看了 參考: 陈曦<<热力学讲义>>ht…

甄选范文“论软件体系结构的演化”软考高级论文,系统架构设计师论文

论文真题 软件体系结构的演化是在构件开发过程中或软件开发完毕投入运行后,由于用户需求发生变化,就必须相应地修改原有软件体系结构,以满足新的变化了的软件需求的过程。体系结构的演化是一个复杂的、难以管理的问题。 请围绕“论软件体系结构的演化”论题,依次从以下三…

Array List集合的基本使用

数组&#xff1a;长度固定 集合&#xff1a;自动扩容 数组&#xff1a;可以存基本数据类型&#xff0c;可以存引用数据类型 集合&#xff1a;可以存引用数据类型&#xff0c;不可以存基本数据类型&#xff08;要换成对应的包装类&#xff09; package ArrayListDemo;import j…

Java | Leetcode Java题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; class Solution {public int maxSumSubmatrix(int[][] matrix, int k) {int ans Integer.MIN_VALUE;int m matrix.length, n matrix[0].length;for (int i 0; i < m; i) { // 枚举上边界int[] sum new int[n];for (int j i; j <…

最新动态鲨鱼导航网引导页html源码

源码介绍 最新动态鲨鱼导航网引导页html源码 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 https://download.csdn.net/download/h…

算法小白刷力扣 3 - 回文数

题目描述 原题链接&#xff1a;https://leetcode.cn/problems/palindrome-number/description/ 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&a…

【功能自动化】使用Excel文档获取参数数据

环境搭建&#xff1a; 1.需要配置WebTours网站 2.安装pandas pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python_dateutil…

EasyExcel 导入计算公式导出展示字符串问题(SUM)

导出自定义表单 结果遇到 SUM函数 时 没有算出结果&#xff0c;直接展示的函数字符串 处理思路 拦截公式字符串 &#xff1a; 将对应的cell 设置 setCellFormula 字符串公式 然后cell类型设置为 CellType.FORMULA 重新配置 这样就解决了问题。 注意先设置CellFormula 然…

物品租赁管理系统-押金预授权-原路退回系统-SAAS本地化及未来之窗行业应用跨平台架构

一、物品租赁管理必要性 经济角度 1. 降低成本 - 对于租赁方而言&#xff0c;无需一次性投入大量资金购买物品。比如&#xff0c;企业在项目初期&#xff0c;如果购买昂贵的设备&#xff0c;会占用大量流动资金&#xff0c;增加财务风险。而通过租赁&#xff0c;可以将固…

从0开始搭建一个SpringBoot项目(从环境配置到运行项目)

文章目录 环境配置JAVA环境配置MySQL数据库配置IDEA安装Navicat 15安装Maven配置 SpringBoot项目创建 环境配置 JAVA环境配置 JDK8下载&#xff1a; 官网下载CSDN下载网盘 安装JDK&#xff0c;一直下一步即可&#xff0c;注意安装的位置&#xff1a; 3. 配置环境变量 &…

R语言统计分析——回归中的异常观测值

参考资料&#xff1a;R语言实战【第2版】 一个全面的回归分析要覆盖对异常值的分析&#xff0c;包括离群点、高杠杆点和强影响点。这些数据点需要更深入的研究&#xff0c;因为它们在一定程度上与其他观点不同&#xff0c;可能对结果产生较大的负面影响。 1、离群点 离群点是指…

【MySQL 10】表的内外连接 (带思维导图)

文章目录 &#x1f308; 一、内连接⭐ 0. 准备工作⭐ 1. 隐式内连接⭐ 2. 显式内连接 &#x1f308; 二、外连接⭐ 0. 准备工作⭐ 1. 左外连接⭐ 2. 右外连接 &#x1f308; 一、内连接 内连接实际上就是利用 where 子句对两张表形成的笛卡儿积进行筛选&#xff0c;之前所有的…

git错误fatal: Unpack error, check server log

git错误fatal: Unpack error, check server log fatal: Unpack error, check server log error: remote unpack failed: error Missing tree xxxxxxxxxxxxxxxxxx 先执行 git fetch 命令&#xff0c;再push。 git拉取远程所有分支/添加远程仓库_git pull所有分支代码-CSDN博客…

SQL基础——MySQL的触发器、存储引擎、事务

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、MySQL的触发器 1.概述 介绍 触发器&#xff0c;就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段&#xff0c;但是触发器无需调用&…