jvm垃圾回收算法以及常见的垃圾回收器

垃圾回收器机制(二):快速解读GC算法之标记-清除,复制及标记整理-算法 相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!思维脑图的方式展示在下图;[外链图片转存中…(img-3NAJ1WE8-1712388423403)] 阅读详情

目录

常见的垃圾回收算法

标记复制算法

标记清除算法

标记整理算法

垃圾回收器

1. Serial收集器

2. Parallel Scavenge/ Parallel Old收集器

3. ParNew + CMS

CMS

为什么CMS停顿时间短?

G1 (Garbage First)

ZGC (The Z Garbage Collector)

如何选择JVM垃圾回收器

有多个维度需要注意:

常见的垃圾回收算法

标记复制算法

将内存分为相等的两块,每次仅使用其中的一块;垃圾回收时,标记存活的对象,将存活的对象复制到另一块区域中,并清理当前区域。(根据两块的逻辑可以判断出这是针对年轻代的一种算法)

问题:

标记清除算法

算法分为“标记”和“清除”阶段:标记存活的对象, 统一回收所有未被标记的对象(一般选择这种);也可以反过来,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 。它是最基础的收集算法,比较简单,但是会带来
两个明显的问题:
1. 效率问题 (如果需要标记的对象太多,效率不高)
2. 空间问题(标记清除后会产生大量不连续的碎片)

标记整理算法

根据老年代的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存,优化了“标记-清除”算法的问题。

垃圾回收器

没有完美的垃圾回收器,只能很具具体场景选择具体的垃圾回收器。

1. Serial收集器

  • 特点:单线程,Stop-The-World,直到它结束
  • 算法:复制算法(年轻代) + 标记-整理(老年代)
  • 适用场景:
    • 客户端应用
    • 小内存(几十MB到一两百MB)
    • 单核CPU环境
  • 优点:简单高效,没有线程交互开销
  • 缺点:停顿时间长
  • 参数:-XX:+UseSerialGC

-XX:+UseSerialGC -XX:+UseSerialOldGC

2. Parallel Scavenge/ Parallel Old收集器

  • 特点:多线程并行,关注吞吐量
  • 算法:复制算法 + 标记-整理
  • 适用场景:
    • 后台计算密集型应用
    • 科学计算、批处理任务
    • 不关注单次停顿时间,关注整体吞吐
  • 优点:吞吐量高,CPU利用率高
  • 缺点:停顿时间不可控,对延迟不敏感
  • 参数:
    • -XX:+UseParallelGC
    • -XX:+UseParallelOldGC
    • -XX:ParallelGCThreads=4
    • -XX:MaxGCPauseMillis=100

其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略,甚至STW等等)和Serial收集器类似。默认的收集线程数跟cpu核数相同,当然也可以用参数(-XX:ParallelGCThreads)指定收集线程数,但是一般不推荐修改。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。

在注重吞吐量以及CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器(JDK8默认的新生代和老年代收集器)。

3. ParNew + CMS

ParNew ,主要针对年轻代,ParNew收集器其实跟Parallel收集器很类似,区别主要在于它可以和CMS收集器配合使用

  • 特点:Serial的多线程版本
  • 算法:复制算法
  • 作用:与CMS配合使用
CMS

Concurrent Mark Sweep,主要针对老年代

  • 特点:并发收集,减少停顿时间;在 JDK 14 及之后的版本中,你无法再使用 CMS 垃圾回收器
  • 算法:标记-清除
  • 适用场景:
    • Web服务器、GUI应用
    • 对响应时间敏感的系统
  • 优点:低停顿,用户体验好
  • 缺点:
    • 产生内存碎片
    • CPU资源敏感(会和服务抢资源)
    • 并发失败时退化为Serial Old
    • 执行过程中的不确定性,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,特别是在并发标记和并发清理阶段会出现,一边回收,系统一边运行,也许没回收完就再次触发full gc,也就是"concurrentmode failure",此时会进入stop the world,用serial old垃圾收集器来回收
  • 参数:-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
为什么CMS停顿时间短?

CMS GC: 初始标记(短暂STW) → 并发标记 → 重新标记(短暂STW) → 并发清除

  1. 将GC工作分摊到多个阶段,只有初始标记和重新标记需要短暂STW

  2. 并发标记和并发清除阶段与用户线程一起运行,不停止应用

  3. 使用卡表和增量更新等技术,减少重新标记阶段的工作量

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作(Parallel收集器工作期间必须STW)

G1 (Garbage First)

  • 特点:面向服务端,可预测的停顿时间模型
  • 算法:标记-整理 + 分区算法
  • 内存布局:将堆划分为多个Region(1MB~32MB)
  • 适用场景:
    • 大内存应用(6GB+)
    • 要求停顿时间可控
    • JDK9+ 的默认选择
  • 优点:
    • 停顿时间可控
    • 整体吞吐量与Parallel相当
    • 有效处理大内存
  • 缺点:
    • 内存占用稍高,堆内存 < 4GB时,G1优势不明显
    • JDK6/7中不够成熟
    • 追求极致吞吐时,Parallel更优
    • 需要亚毫秒级停顿时,ZGC更合适
  • 参数:
    • -XX:+UseG1GC
    • -XX:MaxGCPauseMillis=150
    • -XX:G1HeapRegionSize=16m
  • Q: 为什么G1能替代CMS?

  • A: "G1解决了CMS的内存碎片问题,同时提供了可预测的停顿时间,在大内存场景下表现更好"

ZGC (The Z Garbage Collector)

  • 特点:超低停顿(<10ms),不分代
  • 算法:并发标记-整理
  • 适用场景:
    • 超大堆内存(TB级别)
    • 极致低延迟要求
    • 新架构应用
  • 优点:
    • 停顿时间极短且与堆大小无关
    • 吞吐量损失小
  • 缺点:JDK15才正式生产可用,兼容性要求高
  • 参数:
    • -XX:+UseZGC
    • -Xmx16g -Xms16g
    • -XX:SoftMaxHeapSize=14g
    • -XX:MaxGCPauseMillis=10

如何选择JVM垃圾回收器

有多个维度需要注意:

  • 应用类型:Web服务、批处理、客户端?
  • 堆内存大小:小(<2G)、中(2-8G)、大(>8G)?
  • 停顿要求:可容忍秒级、百毫秒级、十毫秒级?
  • 吞吐要求:最大化吞吐量还是保证响应时间?
  • JDK版本:JDK8还是JDK11+?

小内存或客户端 → Serial
批处理重吞吐 → Parallel Scavenge + Parallel Old  
JDK8 Web应用低延迟 → ParNew + CMS
JDK9+ 现代应用 → G1 (默认)
超大堆极致低延迟 → ZGC/Shenandoah

GC算法 (标记清除、复制、标记整理、 分代收集) 、 新生代 老年代 一、标记-清除算法(Mark-Sweep) 1标记阶段:首先通过根节点,标记所有从根节点开始的可达对象。未被标记的对象就是未被引用的垃圾对象 2清除阶段:清除所有未被标记的对象。 不足:1效率问题:标记和清除两个过程的效率都不高。 2空间问题:标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以... 阅读详情

相关推荐

JVM系列(六)[JVM调优前置基础理论知识,堆内存逻辑分区(分代)模型,对象分配逻辑,常见的垃圾回收算法,常见的垃圾回收器以及组合参数设定]

JVM调优前置基础理论知识,堆内存逻辑分区(分代)模型,对象分配逻辑,常见的垃圾回收算法,常见的垃圾回收器,常见垃圾回收器组合参数设定(JDK1.8)

书院二层楼 1035

四、Jvm垃圾收集器

今天的博客主题 Java虚拟机——》Jvm垃圾收集器 垃圾收集算法 垃圾收集算法主要的几种:分代收集理论、复制算法、标记清除算法、标记整理算法 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。Java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。 比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收.......

刘总Java 276

JVM从入门到精通(六):JVM调优必备理论知识 - 3种垃圾清除算法,常见的垃圾回收器

JVM调优是一层窗户纸,只是看起来很难。学完本节课,让你: 熟悉 GC 常用算法,熟悉常见垃圾回收器,具有实际 JVM 调优实战经验 What is garbage 什么是垃圾?没有引用指向的对象就是垃圾。 怎么找到垃圾? 引用计数 不能解决循环引用 根可达算法 JNI 是本地方法用到的对象 《JVM虚拟机规范》对于根对象的定义,下图右侧: 清除垃圾的算法 标记清除算法 mark-sweep 算法相对简单,存活对象比较多的情况下效率比较高。不适合伊甸区,伊甸区的存活对象比较少。 两边扫描

寒泉 6万+

GC 四大算法:引用计数算法、复制算法、标记清除算法、标记压缩清除算法 。GC:分代收集算法

1、引用计数算法(JVM基本不用)2、复制算法(一般在新生区使用)3、标记清除算法4、标记压缩算法(老年代使用)总结 1、引用计数算法(JVM基本不用) 每个对象都占用一个计数器,每用一次,计数器加一,计数器为0的清除。 2、复制算法(一般在新生区使用) 注意:因为from和to会进行交换,所以哪个为空那个就是to区 在伊甸园区不断生成对象,当满了的时候会出发轻GC,将存活的对象从伊甸园区复制到幸存from区,然后清空伊甸园区,在幸存from区满了后会将伊甸园区和幸存from区都复制到幸存to区,然后.

LongKai_G 1024

JAVA中​​JVM深度解析垃圾回收机制:GC算法(标记-清除、复制、标记-整理)、GC调优(CMS、G1、ZGC)详解

本文深度解析JVM垃圾回收(GC)机制,首先介绍分代收集理论及新生代/老年代内存结构,详细讲解标记-清除、复制、标记-整理三大基础算法特点。随后重点剖析主流GC收集器:CMS(并发标记-清除)适用于低延迟场景但存在碎片问题;G1(垃圾优先)通过Region分区实现可控停顿,成为JDK9+默认收集器;ZGC采用染色指针技术实现超低停顿(≤10ms)。文章结合电商大促等实际案例,说明不同场景下的调优策略,并总结GC选择原则:低延迟选CMS/G1/ZGC,高吞吐用Parallel,大内存优先G1/ZGC。最后强调

zjw541806的博客 201

从病毒分析到安全研究:手把手教你用OD破解加壳程序的反调试机制

本文深入探讨了如何识别并绕过加壳程序的反调试机制,特别是针对使用IsDebuggerPresent等API检测的防护手段。通过实战案例和工具链配置,详细介绍了逆向工程中的关键技巧,包括内存补丁、硬件断点定位OEP等,帮助安全研究人员有效突破软件保护技术。

tgb345678的博客 823

常见垃圾回收算法、垃圾回收器及 JVM 调优

【代码】常见垃圾回收算法、垃圾回收器及 JVM 调优。

csdn_tom_168的博客 1156

瑞萨RA6M5驱动ST7735屏幕避坑指南:从软件SPI到显示汉字与图形的完整流程

本文详细介绍了瑞萨RA6M5单片机驱动ST7735屏幕的完整流程,涵盖硬件连接、软件SPI控制、汉字显示及图形绘制优化等关键步骤。通过避坑指南和实用代码示例,帮助开发者解决屏幕初始化、时序控制、字库移植等常见问题,实现高效稳定的显示效果。

weixin_28705087的博客 275

JVM的GC算法以及常见垃圾回收器

JVM的GC算法以及常见垃圾回收器

YMY哈的博客 1532

centos7 清理缓存

一、系统环境 系统版本 CentOS Linux release 7.3.1611 (Core) 内核版本 Linux xx-user 3.10.0-514.el7.x86_64 #1 SMP 背景 服务器分配的账号是普通用户,只能执行sudo命令 二、缓存查看及基本概念 查看内存使用情况 [user01@xx-user ~]$ free -h total used free shared buff/cache availabl

sunzq55的博客 4004

LTE信令流程实战:从Attach到Service Request的完整解析(附常见问题排查)

本文深入解析LTE信令流程中的Attach和Service Request关键环节,提供从基础原理到实战排查的完整指南。涵盖鉴权、承载建立等核心步骤,分析常见故障模式及优化方案,并附赠信令跟踪工具使用技巧,助力通信工程师提升网络运维效率。

alpha的博客 319

JVM:组成、垃圾回收器、垃圾回收算法、常见命令

【代码】JVM:组成、垃圾回收器、垃圾回收算法、常见命令。

Bbb36921的博客 2428

Halcon手眼标定实战:九点标定法从入门到精通(附完整代码)

本文详细介绍了Halcon环境下九点标定法的完整实现流程,从基础概念到实战技巧,帮助开发者快速掌握手眼标定技术。通过精确采集图像坐标与机械坐标,计算仿射变换矩阵,实现相机与机械臂坐标系的精确映射,适用于工业自动化中的平面定位场景。

v4w5x6的博客 411

JVM 调优理论知识:垃圾回收。常见垃圾回收器、GC算法。PC、PN、CMS、PO、G1、ZGC,JVM GC算法

熟悉GC常用算法,熟悉常见垃圾收集器,具有实际JVM调优实战经验 garbage 什么是garbage?没有被引用的对象都是垃圾 garbage how to find a garbage 如何找到垃圾 1.reference count 引用计数 rc 不能解决的问题: 循环引用。例如 A引用B,B引用C,C引用A. 2.root searching 根可达算法。 线程栈变量、静态变量、常量池、JNI指针 GC algorithms 1. Mark-Sweep ( 标记清...

dandanforgetlove的专栏 3939

YOLOv13涨点改进 | 独家创新、Neck特征融合改进篇 | TGRS 2024 | 引入 EFC增强跨层特征相关创新点,含MSEF(多尺度有效融合模块)二次创新模块,助力遥感目标检测涨点

本文提出EFC(增强跨层特征相关)模块改进YOLOv13模型,显著提升小目标检测性能。EFC通过分组特征聚焦(GFF)和多层特征重建(MFR)增强特征融合效率,在小目标检测任务中平均精度(mAP)提升1.7%,同时减少模型计算量。实验验证EFC在VisDrone等数据集上的有效性,改进后的模型能更好地保留小目标细节信息。还提出二次创新模块MSEF,集成通道和位置注意力机制,进一步优化特征表达。文章详细介绍了模块配置方法和yaml文件修改步骤,为小目标检测任务提供了实用的改进方案。

Ai缝合怪、助力小伙伴高效发论文 325

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8400

【从零学习JVM|第九篇】常见的垃圾回收算法和垃圾回收器

本文介绍了Java堆内存中的垃圾回收算法与实现。主要内容包括:1)四种核心算法:标记清除(简单但有碎片)、标记整理(消除碎片但效率低)、复制算法(高效但内存利用率低)、分代回收(综合运用);2)常见回收器:年轻代的Serial、ParNew、ParallelScavenge,老年代的SerialOld、ParallelOld、CMS;3)G1回收器的创新设计,包括分区管理、可预测停顿和并发处理等特性。文章详细分析了各算法与回收器的优缺点、适用场景及实现原理,帮助开发者根据应用特点选择合适的垃圾回收策略。

uybji的博客 1210

外部PLC触发VisionMaster多流程运行

上一讲,介绍了海康VisionMaster与西门子PLC1200进行S7通信。在前一讲的基础上,讲解如何通过PLC触发,实现VisionMaster的多流程运行。

haier123888的博客 4653

JVM的垃圾回收算法和常见回收器

一、怎么识别一个对象是否被回收 · 引用计数法 每一个对象被引用时,都会对他的引用次数+1,如果引用卸载了那么它的引用次数-1,如果一个对象的引用为0,那么就是说这个对象可以被回收。这种会存在一个问题,就是循环引用,A引用B,B引用A,两个对象相互引用引用次数会一直是1。 ·可达性分析 通过GC Root(我觉得就是Application 启动)开始向下追踪,查看一个对象是否可达,如果都不可达说明对象可以被回收。 补充知识: Java 中的四种引用类型: 强引用:就是将对象赋值给一个变

Chasel_s的博客 213

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

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

【JVM】常见的 Java 垃圾回收算法以及常见的垃圾回收器介绍及选型

文章摘要: 本文系统介绍了垃圾回收的核心机制,包括基本概念、引用类型和垃圾处理流程。重点分析了两种垃圾标记算法:可达性分析(基于GC Roots)和引用计数(Python采用),并详细比较了三种垃圾清除算法:标记清除(产生内存碎片)、复制算法(空间换时间)和三色标记(Go语言采用)。特别深入解析了三色标记算法如何通过混合写屏障解决并发标记时的"标记丢失"问题,实现降低STW时间的目标。文章还阐述了强/软/弱/虚四种引用的特性及其应用场景,以及finalize机制的执行原理。

Shad0wLEO的博客 1131

假人有限元模型

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

JVM垃圾回收算法与常见的垃圾回收器

原文链接 一、常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial Old CMS Parallel Old 堆内存垃圾收集器: G1 每种垃圾收集器之间有连线,表示他们可以搭配使用。 二、新生代垃圾收集器 (1)Serial 收集器 Serial 是一款用于新生代的单线程收集器...

Chen65432125的博客 564

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JVM常见垃圾回收器及算法

1.什么是垃圾? 没有任何引用指向的一个对象或者多个对象(循环引用) 2.如何定位垃圾? 1.引用计数(ReferenceCount) 对象上存放引用它的引用数量,每当有地方引用它时,计数+1,去掉引用时,计数-1,当计数为0时,则认为是垃圾。但这种方案找不到循环引用的垃圾 2.根可达算法(RootSearching) 以静态变量、线程栈中变量、常量池(指向Class对象)、JNI指针(指向native方法用到的类或对象),作为根引用,顺着根引用能找到的对象都不是垃圾,其他的都是垃圾,Hot

任意门的博客 393

jvm内存模型,类加载机制,GC算法,垃圾回收器,jvm线上调优等常见的面试题及答案

jvm内存模型,类加载机制,GC算法,垃圾回收器,jvm线上调优等常见的面试题及答案

chi_666的博客 663

jvm学习的核心(五)---垃圾回收算法和常见垃圾回收器

在并发标记阶段由于程序的工作线程和垃圾收集线程是同时运行或者交叉运行的,那么在并发标记阶段如果产生新的垃圾对象,CMs将无法对这些垃圾对象进行标记,最终会导致这些新产生的垃圾对象没有被及时回收,从而只能在下一次执行Gc时释放这些之前未被回收的内存空间。这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束(stop The world)。

只会写bug的靓仔的博客 943

JVM 垃圾回收算法和常见的垃圾回收器

前言 前文已经介绍了Java虚拟机的内存区域,这一篇文章就重点来探讨一下关于JVM中垃圾回收的知识点,这一块的知识点也是面试中经常考察的地方,比如常见的垃圾回收算法、常见的垃圾回收器等等,废话不多说,直接进入正题。 前置知识 垃圾回收主要集中在Java堆中进行,为对象分配空间,回收垃圾对象空间 在搞清楚垃圾的回收之前,要知道对象在堆内存中是如何进行分配的,对象的分配遵循以下三种原则: 对象优先在Eden区分配 堆空间被分为新生代和老年代,这样划分的目的主要是为了针对不同存活时间的对象分区域更好的进行垃

qq_42705411的博客 289

java垃圾回收器及其算法_JVM垃圾回收几种常见算法和常见收集器

上文我们讲解了需要考虑垃圾回收的内存结构、类型,垃圾回收基础算法和垃圾回收的时机。接下来我们重点研究下几种常见的垃圾回收算法和垃圾收集器。I垃圾回收算法几种常见的垃圾回收算法:标记——清除算法、复制算法、标记——整理算法和分代回收算法。标记——清除算法标记——清除算法的基本思想跟它的名字一样,分为“标记”和“清除”两个阶段;首先标记(判断对象是否回收需要两次标记,遵循上文提到的原则)出所有需要回收...

weixin_39641103的博客 328
上一篇: java对象的内存分配流程
下一篇: synchronized
Learning_foolish
博客等级 码龄9年 14粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值