HotSpot的垃圾回收算法实现及垃圾收集器 《深入理解Java虚拟机:JVM高级特性与最佳实践》笔记六

本文详细介绍了HotSpot虚拟机的垃圾回收算法实现,包括枚举根节点、安全点和安全域的概念,以及各种垃圾收集器的工作原理,如Serial、ParNew、ParallelScavenge、SerialOld、ParallelOld、CMS和G1收集器。深入探讨了新生代和老年代的收集策略,以及G1收集器如何解决空间碎片问题。

参考资料:

HotSpot的垃圾回收算法实现

枚举根节点

在HotSpot的实现中,使用一组称为OopMap的数据结构来得知哪些地方存放着对象引用,在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT(即时编译器)编译过程中,也会在特定的位置记录下来栈和寄存器中哪些位置是引用。这样GC在扫描的时候就可以直接得知这些信息了。

安全点

在OopMap的协助下,HotSpot可以快速准确的完成GC Root枚举,但是导致OopMap内容变化(引用关系变化)的指令非常多,如果为每一条指令生成对应的OopMap,会需要很多额外的空间。
实际上,只是在特定的位置记录了这些信息,这些位置称为安全点(程序只有在到达安全点的时候才能暂停进行GC)。安全点的选定基本上是以程序是否具有让程序长时间执行的特征为标准进行选定的——因为每条指令执行的时间都非常的短暂,程序不太可能因为指令流长度提倡这个原因而长时间运行,“长时间运行”最明显的特征就是指令序列复用,例如方法调用、循环跳转、异常跳转等,所以具有这些功能的指令才会产生safepoint。
对于Safepoint,另一个问题,如何在Gc发生时让所有线程(不包括执行JNI调用的线程)都到最近的安全点再停顿下来。两种方法,抢先式中断和主动式中断。

  • 抢先式中断:GC时,将所有线程全部中断,如果有线程不在安全点上,恢复线程,让其运行到安全点上。
  • 主动式中断:GC需要中断线程的时候,简单的设置一个标志,各个线程主动去轮询这个标志,发现标志位真时就主动中断挂起,轮询标志的地方和安全点是重合的。

安全域

指在一段代码片段中,引用关系不会发生变化。在这个区域的任意地方开始GC都是安全的。

线程执行到安全区域中的代码时,首先标识自己进入了安全区域;在离开安全区域时,要检查系统是否已经完成了枚举根节点(或整个GC过程),完成了就继续执行,否则必须等待直到收到可以安全离开Safe Region的信号。

安全区域是为了解决线程Sleep或Blocked状态的。

垃圾收集器

新生代收集器(复制算法)

Serial收集器

单线程收集器,“单线程”的意义并不仅仅说明它只会使用一个CPU或者一条线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束
应用场景:虚拟机运行在Client模式下的默认的新生代收集器
原因:简单而高效,没有线程交互的开销,可以获得最高的单线程效率。用户桌面应用场景中,分配给虚拟机管理的内存(新生代)一般只有几十兆到一两百兆。客户端的停顿时间控制在几十毫秒最多一百毫秒内,只要不是频繁发生,这点停顿是可以接受的。
在这里插入图片描述

ParNew收集器

Serial收集器的多线程版本,使用多条线程进行垃圾收集,其余行为与Serial一样。
应用场景:Server模式下首选的新生代收集器,一个与性能无关但是重要的原因是,除了Serial,只有它能与CMS收集器配合工作。
在这里插入图片描述

Parallel Scavenge收集器(吞吐量优先)

新生代收集器,使用复制算法来进行收集,并行的多线程收集器,与ParNew收集器类似,但是它的特点是比较关注吞吐量。

  • 吞吐量 = 运行用户代码时候 / (运行用户代码事件 + 垃圾收集时间)
  • 特点:Parallel Scavenge收集器的目的是达到一个可控制的吞吐量。吞吐量即CPU用户运行用户代码的时间与CPU总消耗时间的比值。
  • 应用场景:适合在后台运算而不需要交互太多的任务。

Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,

  • -XX:MaxGCPauseMillis 参数控制最大垃圾收集停顿时间
  • -XX:GCTimeRatio 参数直接设置吞吐量大小。

参数-XX:+UseAdaptiveSizePolicy是一个开关参数,当这个参数打开后,就不需要手工指定新生代的大小、Eden和Survivor的比例、晋升老年代对象的大小等细节参数,虚拟机会根据当前系统的运行情况收集性能监控信息,动态地调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种调节方式称为GC自适应的调节策略。

GC自适应的调节策略也是Parallel Scavenge收集器与ParNew收集器的一个重要区别。

老年代收集器。

Serial Old收集器(标记–整理算法)

Serial收集器的老年代版本,同样是一个单线程收集器
应用场景:Client模式下的虚拟机。
如果使用在Server模式下,那它主要还有两大用途途:
1.JDk1.5及之前的版本中与Parallel Scavenge收集器搭配使用,
2.作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。

Parallel old收集器(标记–整理算法)

Parallel Scavenge收集器的老年代版本,多线程
该收集器在JDK1.6中才开始提供

CMS收集器(标记–清除算法)

CMS收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的JAVA应用集中在互联网网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望停顿越短越好,以给用户带来较好的用户体验。CMS收集器就非常符合这类的应用需求。

CMS(concurrent Mark Sweep)是基于“标记–清除”算法实现的,它的运作过程分为四个步骤:
1.初始标记: 仅仅标记一下GC Roots能直接关联到的对象,速度很快
2.并发标记: 进行GC RootsTracing的过程
3.重新标记: 为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。此阶段的停顿时间比初始标记阶段长比并发标记短。
4.并发清除

**初始标记和重新标记仍然需要“Stop The World”,**但是并发标记和并发清除过程可以和用户线程一起工作,总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

CMS缺点:
1.CMS收集器对CPU资源非常敏感
2.CMS收集器无法处理浮动垃圾,可能出现cconcurrent Mode Failure而导致另一次Full GC的产生
3.产生大量的空间碎片

G1 收集器

G1(Garbage First):是一款面向服务端应用的垃圾收集器,用于替换CMS收集器。在jdk9中将G1变成默认的垃圾收集器,以替代CMS。

G1将新生代,老年代的物理空间划分取消了。

取而代之的是,G1算法将堆划分为若干个区域(Region),它仍然属于分代收集器。不过,这些区域的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间。老年代也分成很多区域,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有cms内存碎片问题的存在了。

G1的特点:
1.并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-the-world停顿的事件,G1收集器可以通过并发的方式让Java程序继续执行
2.分代收集:分代概念,虽然G1不需要其他收集器的配合就能独立管理整个Java堆,但是可以采用不同的方式去处理不同的对象。
3.空间整合:G1整体看来是基于标记整理的算法,从局部看来确实基于复制的算法实现。
4.可预测的停顿

G1之前的收集器进行收集的范围都是整个新生代或者老年代,而使用G1收集器时Java堆的内存布局就发送了变化,他将整个java堆划分为多个大小相等的独立区域(Region)。新生代和老年代是一部分Region的集合。

G1收集器的步骤:
1.初始标记
2.并发标记
3.最终标记
4.筛选回收

两个概念:

  • MinorGC,次收集:在新生代发生的垃圾收集,速度快,发生频繁。
  • FullGC,MajorGC,主收集:发生在年老代的垃圾收集。一般伴随一次MinorGC。

一般的规则:

  • 对象优先在Eden分配。当Eden没有足够的空间时,虚拟机将发起一次MinorGC。
  • 大对象直接进入老年代。大对象是指需要连续内存空间的Java对象。目的是避免在Eden区及两个Survivor区之间大量的内存复制(新生代采用复制算法收集内存)。
  • 长期存活对象将进入老年代。虚拟机给每个对象定义一个对象年龄计数器,如果对象在Eden出生并经过一次Minor GC后仍然存活,并且能够被Survivor容纳,将被移动到Survivor空间,并且对象年龄设为1。对象在Survivor区中每“熬过”一次MinorGC,年龄就加1,达到某个阀值就晋升到年老代。
  • 空间分配担保。在发生Minor GC之前,虚拟机会先检查年老代最大可用的连续空间算法大于新生代所有对象总空间,如果是,那么Minor GC可以确保是安全的。如果否,虚拟机会查看HandlePromotionFailure设置是否允许担保失败。如果允许继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,这是有风险的(存活对象占用的内存大于平均大小,将导致HandlePromotionFailure失败,重新发起一次Full GC);如果小于或者HandlePromotionFailure设置不允许冒险,将改为Full GC。
基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量一致性;后期处理则涉及模型输出的物理量转换结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
在机器人技术领域,机器人操作系统(ROS)的演进为各类应用提供了关键支撑。计算机视觉增强现实的结合,进一步拓展了机器人的感知交互能力。OpenCV作为广泛使用的视觉处理库,集成了多种图像分析模式识别算法。其中,Aruco标记系统作为一种基于二维码的视觉标识,因其识别稳定、计算高效的特点,被广泛应用于空间定位、姿态估计及增强现实场景的虚实融合。 Aruco标记通过预定义的编码图案,可在复杂环境中实现快速检测高精度位姿解算。这一特性使其在自主导航、三维重建、目标跟踪等任务中具有重要价值。例如,在移动机器人定位中,可通过布设标记点辅助实现厘米级的位置修正;在增强现实应用中,则能依据标记的空间姿态准确叠加虚拟信息。 针对ROS2框架,现已开发出集成OpenCV的Aruco标记检测位姿估计工具包。该工具能够实时处理图像流,识别标记的独特编码,并解算其相对于相机坐标系的三维位置旋转姿态。结果可通过ROS2的话题或服务接口发布,为其他功能模块提供实时视觉反馈。工具包兼容多种标准标记字典,用户可根据实际场景的复杂度识别范围需求,灵活选择不同尺寸编码数量的标记集合。 将Aruco检测模块嵌入ROS2系统,可充分利用其分布式通信机制模块化架构。开发者能够便捷地将视觉定位数据运动规划、控制决策等模块相融合,进而构建更为综合的机器人应用系统。例如,结合点云处理技术可实现动态环境的三维建模,或机械臂控制器联动完成基于视觉引导的精准抓取操作。 该开源工具的推出,降低了在ROS2中部署视觉定位功能的技术门槛。通过提供稳定、可配置的标记识别姿态解算方案,它不仅促进了机器人视觉应用的快速原型开发,也为后续在工业自动化、服务机器人、混合现实等领域的深入应用奠定了技术基础。随着感知算法硬件性能的持续提升,此类融合视觉、增强现实机器人中间件的工具包,将在智能化系统的构建中发挥日益重要的作用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值