第三章 垃圾收集器与内存分配策略(二)

本文详细介绍了Java垃圾收集器中的几种经典实现,如Serial、ParNew、ParallelScavenge、ParallOld、CMS和G1,重点讨论了它们的工作原理、特点、吞吐量控制和停顿时间。还涉及了元空间、GC事件分类等内容。

3.5 经典垃圾收集器

垃圾收集器

3.5.1 Serial收集器

单线程收集,适合在客户端Serial

3.5.2 ParNew

是serial的多线程版本,除了serial外,只有他能和CMS配合使用ParNew
并行-并发概念
并发&并行

3.5.3 Parallel Scavenge

以上三款都是【标记-复制】实现的
1.目标:Parallel Scavenge 收集器的特点是它的关注点与其他收集器不同, CMS 等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而 Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量( Throughput)。

吞吐量定义:
吞吐量
2.三个重要参数

1)控制最大垃圾收集停顿时间的-XX: MaxGCPauseMillis

2)直接设置吞吐量大小的-XX:GCTimeRatio

3)自适应调整吞吐量-XX:+UseAdaptiveSizePolicy

3.5.5 Parall Old

是Parallel Scavenge的老年代版本,支持多线程并发收集,基于【标记-整理】
Parall Old

3.5.6 CMS(Concurrent Mark Sweep)

CMS
基于标记-清除

1.分为四个阶段

  • 初始标记
    仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快。
  • 并发标记
    从 GC Roots 的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
  • 重新标记
    为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录(详见 3.4.6 节中关于增量更新的讲解),这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短。
  • 并发清除
    清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。

初始标记和重新标记需要STW。

2.三个明显的缺点

1)占用了一部分线程(或者说处理器的计算能力)而导致应用程序变慢,降低总吞吐量

2)无法处理“浮动垃圾”(Floating Garbage)

在 CMS 的并发标记和并发清理阶段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生,但这一部分垃圾对象是出现在标记过程结束以后, CMS 无法在当次收集中处理掉它们,只好留待下一次垃圾收集时再清理掉。这一部分垃圾就称为“浮动垃圾”。

3)会有大量空间碎片产生

3.5.7 Garbage First

Garbage First(简称 G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于 Region 的内存布局形式。

G1 是一款主要面向服务端应用的垃圾收集器,基于**【标记-整理】**实现。
在这里插入图片描述
1.模型

停顿时间模型

2.目标

能够支持指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过 N 毫秒这样的目标,这几乎已经是实时 Java(RTSJ)的中软实时垃圾收集器特征了。

3.具体实现

面向堆内存任何部分来组成回收集(Collection Set,一般简称 CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多, 回收收益最大,这就是 G1 收集器的 Mixed GC 模式。

堆被划分为一组大小相等的堆区域,每个区域都是连续的虚拟内存范围。G1 执行一个并发的全局标记阶段来确定整个堆中对象的活跃度。标记阶段完成后,G1 知道哪些区域大部分是空的。它首先在这些区域收集,这通常会产生大量的可用空间。这就是为什么这种垃圾收集方法被称为 Garbage-First 的原因。顾名思义,G1 将其收集和整理活动集中在堆中可能充满可回收对象的区域,即垃圾。G1 使用停顿预测模型来满足用户定义的停顿时间目标,并根据指定的停顿时间目标选择要收集的区域数。

G1 识别为可以回收的区域使用疏散进行垃圾收集。G1 将对象从堆的一个或多个区域复制到堆上的单个区域,并在此过程中整理和释放内存。这种疏散在多处理器上并行执行,以减少暂停时间并提高吞吐量。因此,每次垃圾回收时,G1 都会在用户定义的暂停时间内持续工作以减少碎片。这超出了前两种方法的能力。CMS(并发标记扫描)垃圾收集不进行压缩。ParallelOld 垃圾收集仅执行整个堆压缩,这会导致相当长的暂停时间。

需要注意的是,G1 不是实时收集器。它以高概率但不是绝对确定地满足设定的暂停时间目标。根据之前收集的数据,G1 会估计在用户指定的目标时间内可以收集多少个区域。因此,收集器有一个相当准确的区域收集成本模型,并且它使用该模型来确定要收集哪些区域以及要收集多少区域,同时保持在暂停时间目标内。

4.特点

  1. 用 Region 划分内存空间,以及具有优先级的区域回收方式,保证了 G1 收集器在有限的时间内获取尽可能高的收集效率。
  2. 并发+并行
    可以使用多个CPU来减少STW的停止时间,而且还是多线程并发执行的
  3. 可预测的停顿
    能让用户指定在GC上所消耗的时间,不让他超过一定的时间。

5.步骤

  • 初始标记
  • 并发标记
  • 最终标记
  • 筛选回收

除了并发标记其余都要STWG1运行
6.新理念

​ 不再追求把Java堆全部清理干净,只要收集的速度能跟得上对象分配的速度,那一切就能运作得很完美。这种新的收集器设计思路从工程实现上看是从 G1 开始兴起的,所以说 G1 是收集器技术发展的一个里程碑。

3.5.8 几种垃圾收集器比较

参考:https://blog.csdn.net/doubututou/article/details/109069092
比较
G1选择详细说明:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/G1.html#use_cases

  1. 超过50%的存活对象占用着堆内存
  2. 对象分配速度上升变化非常快
  3. 不希望长时间垃圾收集或者整理暂停

3.5.9 个人补充

第一点:GC事件分类:

根据垃圾收集回收的区域不同,垃圾收集器主要分为:

  • Young GC
  • Old GC
  • Full GC
  • Mixed GC
  1. Young GC

新生代内存的垃圾收集事件称为Young GC(又称Minor GC),当JVM无法为新对象分配在新生代内存空间时总会触发Young GC。

比如Eden区占满时,新对象分配频率越高,Young GC的频率就越高。

Young GC每次都会引起Stop-The-World,暂停所有的应用程序,停顿时间相对老年代GC造成的停顿,几乎忽略不计

  1. Old GC、Full GC、Mixed GC

Old GC:只清理老年代空间的GC事件,只有CMS的并发收集是这个模式

Full GC:清理整个堆的GC事件,包括新生代、老年代、元空间等。

Mixed GC:清理整个新生代以及部分老年代的GC,只有G1有这个模式。

**以上个人理解:**CMS之前的那几种老年代垃圾收集器,他们都是并行操作的,也就是说占用了所有的工作线程来操作,当老年代满了的时候,就会触发Old GC,会STW,又由于Young GC时间很短,所以就Full GC了。但是CMS收集行为是并发的,部分状态是可以和用户线程同时进行的,这些状态不会STW,所以就没有必要和Young GC放一起清理。对于G1,Young GC的时候主要对Eden区进行GC,当老年代空间达到阀值会触发Mixed GC,选定所有的新生代Region,根据全局并发标记阶段(下面介绍到)统计得出收集收益高的若干老年代 Region。

第二点:元空间:

java8中移除了永久代,新增了元空间的概念。原来的方法区是逻辑划分中的一个区域,对应hotspot jdk6中的永久代,可以说永久代是方法区在hotspot的一个具体实现,但是从jdk7以后方法区就“四分五裂了”,不再是在单一的一个去区域内进行存储。

java8中继承了一些jdk7中的改变:符号引用存储在native heap中,字符串常量和静态类型变量存储在普通的堆区中,这个影响了String的intern()方法的行为,这里不做intern的详述。

而在java8中移除了永久代,新增了元空间,其实在这两者之间存储的内容几乎没怎么变化,而是在内存限制、垃圾回收等机制上改变较大。元空间的出现就是为了解决突出的类和类加载器元数据过多导致的OOM问题,而从jdk7中开始永久代经过对方法区的分裂后已经几乎只存储类和类加载器的元数据信息了,到了jdk8,元空间中也是存储这些信息,而符号引用、字符串常量等存储位置与jdk7一致,还是“分裂”的方法区。

符号引用没有存在元空间中,而是存在native heap中,这是两个方式和位置,不过都可以算作是本地内存,在虚拟机之外进行划分,没有设置限制参数时只受物理内存大小限制,即只有占满了操作系统可用内存后才OOM。

个人理解:类和类加载器元数据存放在永久代,也就是元空间的前生,元空间的引入就是为了解决这两类信息过多导致的OOM问题。

第三点:内存比例
Survivor与Eden区比例:1:8
年轻代:老年代是 1:2

2026年全网最全的OpenClaw技术实践资料合集,包含最新技术资料+安全研究+安装部署等资料,供大家学习参考。一、技术资料合集2026厦大团队:智能体OpenClaw(小龙虾)应用实践-94页.pdf2026年AI原生组织:OpenClaw推动组织形态重塑_47页.pdf2026年OpenClaw入门指南V4.0(含腾讯QClaw、字节ArkClaw大厂版本解读)_39页.pdf2026年OpenClaw安全部署实践指南-27页.pdf2026年Openclaw龙虾全维度安全实战指南_67页.pdf2026年OpenClaw(龙虾)全自动科研报告:OpenClaw替我干科研_225页.pdf2026年腾讯云智能体开发平台企业级ADP Claw最佳实践教程_25页.pdf2026清华大学:OpenClaw科研手册-38页.pdfHello OpenClaw中文手册(使用篇+开发篇+实战篇)_457页.pdfOpenClaw 养成路线图:8个阶段(从装完到用好的完整流程)_22页.pdfOpenClaw001:龙虾使用入_81页.pdfOpenClaw从中级到高级完整教程_32页.pdfOpenClaw企业级部署安装解决方案_9页.pdfOpenClaw使用本地化适配指南v1.1_12页.pdfOpenClaw保姆级安装+部署教程大全OpenClaw入门指南:从零到你的第一个 AI 数字助理_10页.pdfOpenClaw养虾全景报告:28个案例_80页.pdfOpenClaw发展研究报告1.0_75页.pdfOpenClaw发展研究报告2.0_82页.pdfOpenClaw安全使用实践指南(CNCERT).pdfOpenClaw安全操作指南(2026年)_73页.pdfOpenClaw完全使用手册_45页.pdfOpenClaw完全指南:从入门到精通_v1.0_629页.pdfOpenClaw完全指南:从原理到实现的专家级解析(2026年)_307页.pdfOpenClaw实战手册_51页.pdfOpenClaw新手入门宝典_82页.pdfOpenClaw极简安全实践指南_9页.pdfOpenClaw橙皮书:从入门到精通_98页.pdfOpenClaw深度测评应用指南_27页.pdfOpenClaw生态威胁分析报告(2026年)_18页.pdfOpenClaw的强大是否会照进现实_116页.pdfOpenClaw自我研究报告1.0_68页.pdfOpenClaw零基础培训课件_38页.pdfOpenClaw龙虾第三次AI平民化:自主Agent时代到来_16页.pdfOpenClaw(AI+智能体)在法律行业的实际运用落地报告_14页.pdfOpenclaw(龙虾)全维度安全实战指南:从风险全防护到企业零信任防御架构_67页.pdfOpenClaw:AI从聊天到行动下一代智能助手白皮书_44页.pdfOpenClaw:投研人如何“养虾”(2026年)_31页.pdfOpenClaw:详细的小白安装教程及避坑指南_11页.pdf从对话到执行:OpenClaw企业级智能体应用手册(2026年)_102页.pdf从零上手OpenClaw科研智能体-34页.pdf以 OpenClaw 为例深度剖析 AI Agent 运作原理_31页.pdf北京大学:龙虾第三次AI平民化 自主Agent时代到来(2026年)_16页.pdf华为:2026年部署OpenClaw代理解决方案(中文版)_47页.pdf华为:2026年部署OpenClaw代理解决方案(中英版)_94页.pdf华为:2026年部署OpenClaw代理解决方案(英文版)_47页.pdf在阿里云上部署 OpenClaw 完整指南_28页.pdf小白部署OpenClaw完整教程_30页.pdf快速部署OpenClaw(Clawdbot)极简部署视频教程快速部署避坑指南:OpenClaw 72 小时血泪实录_9页.pdf政企版龙虾OpenClaw安全使用指南(2026年)_53页.pdf智能体OpenClaw(小龙虾)应用实践_94页.pdf最全面的OpenClaw中文教程(入门+核心技术+进阶+实战)_843页.pdf清华&北航:OpenClaw在媒体中的应用(2026年)_28页.pdf清华大学:AI谣言研究报告OpenClaw版(2026年)_80页.pdf清华大学:OpenClaw“驯化”还是“进化”?(2026年)_95页.pdf清华大学:OpenClaw数字员工研究报告(2026年)_46页.pdf清华大学:龙虾OpenClaw管理学(2026年)_79页.pdf腾讯OpenClaw:最全企业级安全养虾教程(2026年)_25页.pdf腾讯云:云上养虾(OpenClaw)安全指南_23页.pdf阿里云DataClaw帮你“智”动驾驶数据库(2026年)_87页.pdf阿里云DataClaw:如何让Agent安全访问数据(2026年)_47页.pdf阿里云:深入理解OpenClaw技术架构实现原理_52页.pdf高校教师养小龙虾(OpenClaw)实战_95页.pdf、OpenClaw保姆级安装+部署教程大全3-skills.txtOpenClaw一键安装教程【中文】.pdfOpenClaw从入门到精通实战手册+飞书多Agent教程.docx01-OpenClaw介绍02-阿里云一键部署OpenClaw03-腾讯云一键部署OpenClaw04-阿里百炼大模型使用05-实战:OpenClaw接入钉钉全流程06-实战:OpenClaw接入飞书全流程07-终端启动日志输出和退出日志输出模式三、OpenClaw保姆级安装+部署教程大全不求人白嫖openclaw龙虾云服务部署一站式设置.pdfClawdbot部署教程.mp4Clawdbox极简部署教程(1).pdfClawdbox极简部署教程(2).pdfwindows实战.docxWindows用户安装方法.docx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倜傥村的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值