四种常用的垃圾收集器

Java面试题——第九篇(JVM) 三色标记算法是现代垃圾回收器中常用的一种增量标记算法。可以与应用线程并发执行,用于标记哪些对象需要被回收,哪些需要被保留,减少一次性停顿带来的性能影响。非常适合 低延迟和实时垃圾回收的场景。他通过将对象分为三种颜色来进行标记和追踪。三色标记基本概念白色对象:表示还没有被垃圾回收器访问到的对象,这些对象有可能是垃圾。灰色对象:表示已经被访问到,但其引用的其他对象还没有被处理完。黑色对象:表示已经被访问到且其引用的所有对象也都已经标记完毕,这些对象不会被回收。标记过程初始状态:所有对象都是白色。 阅读详情

四种常用的垃圾收集器

对于垃圾收集器做个小总结: 

         垃圾回收器从线程运行情况分类有三种

  1. 串行回收,Serial回收器,单线程回收,全程stw;
  2. 并行回收,名称以Parallel开头的回收器,多线程回收,全程stw;
  3. 并发回收,cms与G1,多线程分阶段回收,只有某阶段会stw;

注:

串行回收: JDK1.5前的默认算法 缺点是只有一个线程,执行垃圾回收时程序停止的时间比较长

并行(parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。多个线程执行垃圾回收适合于吞吐量的系统,回收时系统会停止运行   高并发项目适合 

并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替进行),用户程序在继续镜像,而垃圾收集程序运行于另一个CPU上。

 


 

下面常用的四个收集器:

serial收集器(复制算法)

串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;

垃圾收集的过程中会Stop The World(服务暂停)

一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。

特点:CPU利用率最高,停顿时间即用户等待时间比较长。

适用场景:小型应用

通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

 

ParNew收集器(停止-复制算法)

ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩

参数控制:-XX:+UseParNewGC  ParNew收集器

-XX:ParallelGCThreads 限制线程数量

默认串行(JDK1.0开始就有了 JDK1.5之后有了并行)

新生代并行,老年代串行目的:回收频率决定的啊啊哈

 

parallel 收集器 (停止-复制算法)

Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量(并行的)。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例;新生代复制算法、老年代标记-压缩

 

采用多线程来通过扫描并压缩堆
特点:停顿时间短,回收效率高,对吞吐量要求高。
适用场景:大型应用,科学计算,大规模数据采集等。
通过JVM参数-XX:+UseParallelGC 打开并发标记扫描垃圾回收器。

 

CMS收集器(标记-清理算法)

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。

从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于“标记-清除”算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为4个步骤,包括:

初始标记(CMS initial mark)

并发标记(CMS concurrent mark)

重新标记(CMS remark)

并发清除(CMS concurrent sweep)

其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。

   由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收集器(新生代使用ParNew)

 优点:

        并发收集、低停顿、响应时间快

 缺点:

      1、对CPU资源非常敏感
      2、CMS收集器无法处理浮动垃圾,即清除时用户进程同时产生的垃圾,只能等到下次GC时回收,并发阶段会降低吞吐量
      3、因为是使用“标记-清除”算法,所以会产生大量碎片

 

特点:响应时间优先,减少垃圾收集停顿时间,适用于对响应时间要求高的系统

适应场景:大型服务器等。

通过JVM参数 -XX:+UseConcMarkSweepGC设置

g1收集器

在G1中,堆被划分成 许多个连续的区域(region)。采用G1算法进行回收,吸收了CMS收集器特点。

特点:支持很大的堆,高吞吐量

  --支持多CPU和垃圾回收线程

  --在主线程暂停的情况下,使用并行收集

  --在主线程运行的情况下,使用并发收集

实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收

通过JVM参数 -XX:+UseG1GC 使用G1垃圾回收器

注意: 并发是指一个处理器同时处理多个任务。 
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。 
来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。 

 

参考:https://www.cnblogs.com/aspirant/p/8662690.html

 

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图) 本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。 阅读详情

相关推荐

杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)

使用keycloak实现SSO单点登录(概念、原理、逻辑、详细步骤、难点解释)

野生猿林仔的博客 2万+

【JVM】垃圾收集器-Serial、Parallel、ParNew、CMS的特性与优缺点总结

Serial垃圾收集器 ParallelScavenge垃圾收集器 ParNew垃圾收集器 CMS垃圾收集器 Rset与CardTable 打印GC日志到文件 总结 Serial垃圾收集器 Serial垃圾收集器是一个历史非常悠久的垃圾收集器,JDK1.3.1前是HotSpot年轻代垃圾收集的唯一选择; 其年轻代采用复制算法,老年代采用标记-整理算...

稻草人的技术小站 5242

【模型】OpenClaw 接入阿里云永久免费模型方案

Qwen2.5-7B-Instruct 模型为例。

海兰 4473

java中垃圾收集_Java垃圾回收(3):常见的四种垃圾收集器

本节我们将介绍几种可用的Java垃圾收集器。垃圾回收是一个自动进程,它把开发人员从内存的分配与回收的杂务中解放出来。本文是“Java垃圾回收系列”的第三篇。在上一篇,也就是第二篇中,我们了解了Java垃圾回收的工作原理,这节非常有意思,我推荐你看一看。在第一篇“Java垃圾回收入门”中,我们介绍了Java虚拟机架构,堆内存模型以及Java相关的一些术语。Java有四种垃圾收集器:D瓜哥注这是四种类...

weixin_35545345的博客 405

【招商银行笔试题汇总】[全网首发]2024-04-23-招商银行春秋招笔试题-三语言题解(CPP/Python/Java)

🏳️ 难难难!!!本次招商银行的笔试算是今年春招最难的场次之一了K小姐所在的公司有 NNN 个部门,编号从 111 到 NNN。由于公司网络系统比较老旧,对于同一个数据 ddd,不同部门记录的值可能不同。数据 ddd 在各部门被记录为 d1,d2,...,dNd_1, d_2, ..., d_Nd1​,d2​,...,dN​。公司提出可以通过会议来实现数据的一致性。每次会议会让相邻编号范围内的所有部门一起参加,如果有超过半数的部门能够对数据 ddd 的值达成共识,那么在此次会议后,参与会议的所有部门会将

春秋招笔试突围 3463

[VT虚拟化驱动] 定义类及初始化内存区域

文章目录前言框架整体流程图类的定义初始化内存区域本章代码 前言 为什么不用C而用C++呢? 在单核的情况下,用C还比较方便些,但在多核的情况下,每个核心都需要分配有对应的一个VMX区域,VMCS区域,MsrBitmap区域和栈空间,以及对应的初始化函数,如果使用安装DPC回调的方式在多核情况下进行初始化,只使用同一个初始化函数,当函数被多个CPU核心同时执行,会出现很多意想不到的的错误,我用自旋锁试了一下是依照各种错误,所以果断用C++了,把这些每个核心都需要一份的封装到一个类里 框架整体流程图 类的定义

吾无法无天的博客 1836

JVM-垃圾收集器

jvm垃圾收集器

7798

【无人机路径规划】基于强化学习实现多无人机路径规划

【无人机路径规划】基于强化学习实现多无人机路径规划

k8291121的博客 1656

JVM系列5——垃圾收集器

java堆主要分为新生代和老年代两部分,新生代主要使用复制或者标记清除垃圾回收算法,老年代使用标记整理回收算法。java虚拟机提供了不同的收集器。垃圾收集的目标范围整个新生代(Minor GC)或者整个老年代(Major GC)或者整个Java堆(Full GC)。下图展示了七种作用于不同分代的收集器,如果两个收集器存在关联可以搭配使用。

xiaodigua1024的博客 1866

Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一)

34. 默认格式是BNP format格式,会被Sigrity识别的S参数文件,在仿真完成后,默认会在文件夹中生成bnp和ckt(MCP)文件,无需这步操作。由于port设置的ref Z是50ohm,实际上电源网络的阻抗是没有这么高的,所以S参数回损曲线是基本上全反射的一个状态。Sigrity PowerSI是频域电磁场仿真工具,以下图为例介绍如果用它观测电源的网络的S参数以及阻抗的频域曲线.42. Spice格式的加载进来图标是橙色的,BNP格式的图标是灰色的。

weixin_54787054的博客 1279

【YOLOv11工业级实战】15. YOLOv11海洋监测实战:珊瑚礁健康评估(水下图像增强|机器人搭载)

摘要:本文针对珊瑚礁健康评估的海洋监测需求,基于YOLOv11提出解决方案,聚焦水下色偏、悬浮物干扰、珊瑚形态复杂三大难题。引用全球珊瑚礁监测网络(GCRMN)标准,采用CoralNet数据集,通过Jaffe-McGlamery物理模型引导增强与悬浮物去除算法,在浑浊水域(能见度<5m)实现87.3%的健康珊瑚识别率,藻类误判率低至7.2%。介绍了以BlueROV2水下机器人和Jetson AGX Orin为核心的部署方案,结合水下SLAM定位技术,实现珊瑚健康的实时评估与三维覆盖率计算。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1644

JVM:垃圾收集器(7种)

CMS(Concurrent Mark Sweep)收集器是以获取最短回收停顿时间的为目标的收集器。注重服务的响应速度,希望系统停顿时间尽可能短,以给用户更好的交互体验。这个收集器是基于标记清除算法实现的。用于老年代的收集。 收集过程有四个阶段:1、初始标记 2、并发标记 3、重新标记 4、并发清除 四个阶段中初始标记和重新标记仍需要暂停所有的用户线程(Stop The World),但为什么说这个收集器也暂停了所有的线程,为什么还能做到停顿时间

qq_64680177的博客 3611

19、英国模式:银行体系的演变与现代金融架构

本文深入探讨了英国银行体系从专业化向全能银行的演变过程,分析了自律监管模式的优劣,并解析了围栏制度对金融稳定的影响。同时,文章还介绍了信用合作社、建筑协会和投资银行的角色与转型,全面展示了英国金融体系的多样性与复杂性,以及其在全球金融市场中的重要作用。

embedding5hiker的博客 105

四种常用垃圾收集器

有没有人知道并行回收和串行回收的区别: 1. 一个是串行单线程,并行是多线程的回收,串行是单线程,一般来说很少用串行, 服务器一般都是多核的,一般都是并行回收的,并行收集器和串行收集器的区别是什么呢,在JDK1.5之前,默认算法就是串行回收, 垃圾收集器如果在回收的时候,他就会停止其他的线程,而且会影响到其他的线程,这也是他的缺点,串行收集一般用于传统的项目, 有些传统的项目是不会做JV...

Leon_Jinhai_Sun的博客 883

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java对象创建与垃圾收集器实现

Java是一门面向对象的编程语言,在Java程序运行过程中,无时无刻都有对象被创建出来;当对象没被引用时,Java垃圾收集器此时发挥作用,回收没有用的对象,释放对应所占的内存。 一、Java对象创建 在语言层面上,java创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象是如何创建的呢? 虚拟机遇到一条new指令时,首先将去检查这个指令的...

学习记录 2377

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

G1垃圾收集器

G1 是一款面向服务器的垃圾收集器,主要针对多处理器及大内存的机器. 以极高概率满足GC 停顿时间要求的同时,还具备高吞吐量性能特征。

qq_41184048的博客 1798

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java中的垃圾收集器

总结自《深入理解Java虚拟机:JVM高级特性与最佳实践》第3章 1、GC(Garbage Collection)需要完成的3件事: 哪些内存需要回收? 什么时候回收? 如何回收?   2、哪些内存需要回收?引申出如何判断对象是“存活”,还是“死去(即不能再被任何途径使用的对象)”:     2.1 引用计数算法:给对象中添加一个引用计数器,每当有 一个地方引用它时,计数器值就加1...

h1458280799的博客 295

JVM基础总结04 - JVM进阶之垃圾回收

JVM基础总结04 - JVM进阶之垃圾回收 一、GC垃圾回收算法和垃圾收集器的关系?分别是什么 1.GC算法(引用计数/复制/标记清楚/标记整理)是内存回收的方法论,垃圾收集器是算法的落地实现 2.目前为止还没有完美的收集器出现,更没有万能的收集器,只有针对具体应用最合适的收集器,进行分代收集二、4种主要的垃圾收集器 串行 并行 并发 G1 1.串行垃圾回收器 它为单线程环境设计,且只使用一个线程进行垃圾回收,会暂停所有的用户线程,所以不适合服务器环境 2.并行垃圾回收器 多个垃圾收集线...

Juwenzhe_HEBUT的博客 217

java垃圾回收机制

java垃圾回收机制

weixin_57248557的博客 321

<JVM>

JVMJVM垃圾回收机制(GC)一、怎样标识哪些对象“已死”?1.引用计数算法2.可达性分析算法哪些对象可作为GC Roots?二、Java中四种引用强引用(Strong Reference)软引用(Soft Reference)弱引用(Weak Reference)虚引用(Phantom Reference)三、finalize()赋予对象重生四、回收方法区五、垃圾收集算法1.标记-清理算法(Mark-Sweep)2.复制算法(Copy)3.标记-整理算法(Mark-compact)4.分代收集算法(Ge

m0_67227632的博客 1409

67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优

67.Java垃圾收集机制 67.1.对象引用 67.2.垃圾对象的判定 67.3.垃圾收集算法 67.3.1.标记—清除算法 67.3.2.标记—整理算法 67.3.3.分代收集 67.4.垃圾收集器 67.5.性能调优 67.Java垃圾收集机制 67.1.对象引用 Java 中的垃圾回收一般是在 Java 堆中进行,因为堆中几乎存放了 Java 中所有的对象实例。谈到 Java 堆中的垃圾回收,自然要谈到引用。在 JDK1.2 之前,Java 中的引用定义很很纯粹:如果 reference 类型的数据

涂作权的博客 324

008、JVM总结二

此部分的内容是关于垃圾回收。

Yora123的博客 106

虚拟机记忆集合卡表 对象引用

当内存空间还足够时,则保存在内存中,如果内存空间在进行垃圾回收后还是很紧张,则可以抛弃这些对象。强引用软引用弱引用虚引用这四种引用强度逐渐减弱。除强引用外,其他三种引用都可以在java.lang.ref包中找到。Reference子类中只有终结器引用是包内可见的,其他3种引用类型均为public,可以在应用程序中直接使用。强引用(StrongReference):最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“”这种引用关系。

qqqwx_111118的博客 1519

深入理解Java虚拟机(二)-----垃圾回收(GC)

什么是GCgc指的就是java虚拟机垃圾回收,它回收区域针对的对象是堆内存和方法区,因为栈内存(本地方法栈和虚拟机栈在hotspot虚拟机中统称为栈)它只存活于方法运行时,是由虚拟机自动进行垃圾回收的,不需要程序员关心 Minor GC:对新生代对象的垃圾回收 Full GC(Major GC):对老年代区对象的回收如何判断对象可回收1、引用计数算法(过时):对象被引用,它的引用计数器就会+1,

1Q84emo的博客 285

java stringbuilder从头部,Android面试题(一)Java基础篇

1.GC核心思想:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能。2.GC roots来源:① 虚拟机栈中引用的对象。② 方法区中类静态属性引用的对象。③ 方法区中常量引用的对象。④ 本地方法栈中JNI引用的对象3....

weixin_39686634的博客 138

jdk8默认垃圾回收器_JVM 的垃圾回收器,你心中的疑惑问题都在这里了(上)

关于JVM的垃圾回收器,很多同学也提出了很多问题,本期内容将把大家的疑惑问题整理出来,给大家一起学习,欢迎大家一起来交流!本次内容概要:1、JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots2、如何盘点查看JVM系统默认值3、你平时⼯作⽤过的JVM常⽤基本配置参数有哪些4、强引⽤,软引⽤,弱引⽤,虚引⽤作⽤分别是什么5、请你谈谈对OOM的认识6、==GC垃圾回收算法和垃圾收...

weixin_39745269的博客 725
上一篇: 内存溢出与内存泄漏区别
下一篇: JVM垃圾收集器
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值