JVM垃圾收集器详解

本文涉及:JVM中各垃圾收集器的介绍及常用参数、JVM的两种模式

串行收集器

Serial 垃圾收集器

一个单线程的收集器,使用复制算法。它只会使用一条线程工作,并且在进行垃圾收集的同时,必须暂停其他所有的工作线程(Stop The Word),直到垃圾收集结束。

虽然在收集垃圾过程中需要暂停所有其他的工作线程,但是对于单个 CPU 环境来说,没有线程交互的开销,可以获得最高的单线程垃圾收集效率

Serial Old 收集器

Serial 垃圾收集器老年代版本,它同样是个单线程的收集器,使用标记-整理算法

相关参数

  •  -XX:+UseSerialGC:在新生代和老年代使用的串行收集器

  •  -XX:SurvivorRatio:设置eden区大小和survivor区大小的比例

  •  -XX:PretenureSizeThreshold:设置大对象直接进入老年代的阀值,当对象的大小超过这个值时,将直接在老年代分配

  •  -XX:MaxTenuringThreshold:设置对象进入老年代的年龄的最大值,每一次MinorGC后,对象年龄就加1,任何大于这个年龄的对象,一定会进入老年代

并行收集器

ParNew 垃圾收集器

Serial 收集器的多线程版本,也使用复制算法,除了使用多线程进行垃圾收集之外,其余的行为和 Serial 收集器完全一样,在垃圾收集过程中同样也要暂停所有其他的工作线程。

默认开启和 CPU 数目相同的线程数

Parallel Scavenge 收集器

新生代垃圾收集器,同样使用复制算法,也是一个多线程的垃圾收集器,它重点关注的是程序达到一个可控制的吞吐量(运行用户代码时间/(运行用户代码时间+垃圾收集时间)),高吞吐量可以最高效率地利用 CPU 时间,尽快地完成程序的运算任务,主要适用于在后台运算而不需要太多交互的任务。自适应调节策略也是 ParallelScavenge 收集器与 ParNew 收集器的一个重要区别

Parallel Old 收集器

Parallel Scavenge的老年代版本,使用多线程的标记-整理算法

相关参数

  •  -XX:+UseParNewGC:在新年代使用并行收集器

  •  -XX:+UseParallelOldGC:在老年代使用并行收集器

  •   -XX:ParallelGCThreads:设置用于垃圾回收的线程数。通常情况下可以和CPU数量相等,但在CPU数量比较多的情况下,设置相对较小的数值也是合理的。

  •  -XX:MaxGCPauseMillis:设置吞吐量大小,它的值是一个大于0的整数,收集器在工作时,会调整Java堆大小或者其他一些参数,尽可能地把停顿时间控制在MaxGCPauseMillis以内。

  •  -XX:GCTimeRatio:设置吞吐量大小,它的值是一个0到100之间的整数,假设GCTimeRatio的值为n,那么系统将花费不超过1/(1+n)的时间用于垃圾回收

  •  -XX:+UseAdaptiveSizePolicy:打开自适应GC策略,在这种模式下,新生代的大小、eden和survivior的比例、晋升老年代的对象年龄等参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。

并发收集器

CMS 收集器

这个收集器的目标是为了获取最短垃圾回收停顿时间,它使用多线程的标记-清除算法

CMS 工作机制

  • 初始标记,只标记跟节点能直接关联的对象

  • 并发标记,进行根节点跟踪的过程

  • 重新标记,为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录

  • 并发清除,清除根节点不可达对象

  • 由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户现在一起并发工作,所以总体上来看CMS 收集器的内存回收和用户线程是一起并发地执行

相关参数

  • -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器

  • -XX:ParallelCMSThreads:设定CMS的线程数量

  • -XX:CMSInitiationgOccupancyFraction:设置CMS收集器在老年代空间被占用多少后触发,默认为68%

  • -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理

  • -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩

  • -XX:+CMSClassUnloadingEnabled:允许对永久区进行回收

  • -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收(前提是-XX:+CMSClassUnloadingEnabled激活了)

  • -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候才进行CMS回收

  • -XX:+CMSIncrementalMode:使用增量模式,比较适合单CPU

G1 收集器

目前垃圾收集器理论发展的最前沿成果,相比与 CMS 收集器,G1 收集器两个最突出的改进是:

  • 基于标记-压缩算法,不产生内存碎片

  • 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收

相关参数

  • -XX:+UseG1GC:使用G1回收器

  • -XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间

  • -XX:GCPauseIntervalMillis:设置停顿间隔时间

JVM启动的两种模式

  • client模式:开发时默认启动模式

  • server模式:使用-server强制开启server模式,

两者的主要区别:

  • server模式下做了大量的优化工作。

  • server模式下应用启动较慢,但在长时间运行情况下,运行速度会越来越快。

  • client模式启动快,但不适合长时间运行。

640?wx_fmt=jpeg

万水千山总是情,点个 “在看” 行不行!!!

640?wx_fmt=png 

内容概要:本文介绍了一个基于多传感器融合的定位系统设计方案,采用GPS、里程计和电子罗盘作为定位传感器,利用扩展卡尔曼滤波(EKF)算法对多源传感器数据进行融合处理,最终输出目标的滤波后位置信息,并提供了完整的Matlab代码实现。该方法有效提升了定位精度与稳定性,尤其适用于存在单一传感器误差或信号丢失的复杂环境,如自动驾驶、移动采用GPS、里程计和电子罗盘作为定位传感器,EKF作为多传感器的融合算法,最终输出目标的滤波位置(Matlab代码实现)机器人导航等领域。文中详细阐述了各传感器的数据建模方式、状态转移与观测方程构建,以及EKF算法的具体实现步骤,具有较强的工程实践价值。; 适合人群:具备一定Matlab编程基础,熟悉传感器原理和滤波算法的高校研究生、科研人员及从事自动驾驶、机器人导航等相关领域的工程技术人员。; 使用场景及目标:①学习和掌握多传感器融合的基本理论与实现方法;②应用于移动机器人、无人车、无人机等系统的高精度定位与导航开发;③作为EKF算法在实际工程中应用的教学案例或项目参考; 阅读建议:建议读者结合Matlab代码逐行理解算法实现过程,重点关注状态预测与观测更模块的设计逻辑,可尝试引入真实传感器数据或仿真噪声环境以验证算法鲁棒性,并进一步拓展至UKF、PF等更高级滤波算法的研究与对比。
内容概要:文章围绕智能汽车一代传感器的发展趋势,重点阐述了BEV(鸟瞰图视角)端到端感知融合架构如何成为智能驾驶感知系统的范式。传统后融合与前融合方案因信息丢失或算力需求过高难以满足高阶智驾需求,而基于Transformer的BEV融合方案通过统一坐标系下的多源传感器特征融合,在保证感知精度的同时兼顾算力可行性,显著提升复杂场景下的鲁棒性与系统可靠性。此外,文章指出BEV模型落地面临大算力依赖与高数据成本的挑战,提出“数据采集-模型训练-算法迭代-数据反哺”的高效数据闭环体系,通过自动化标注与长尾数据反馈实现算法持续进化,降低对人工标注的依赖,提升数据利用效率。典型企业案例进一步验证了该路径的技术可行性与经济价值。; 适合人群:从事汽车电子、智能驾驶感知算法研发的工程师,以及关注自动驾驶技术趋势的产品经理和技术管理者;具备一定自动驾驶基础知识,希望深入了解BEV架构与数据闭环机制的专业人士。; 使用场景及目标:①理解BEV+Transformer为何成为当前感知融合的主流技术路线;②掌握数据闭环在BEV模型迭代中的关键作用及其工程实现逻辑;③为智能驾驶系统架构设计、传感器选型与算法优化提供决策参考; 阅读建议:本文侧重技术趋势分析与系统级思考,建议结合实际项目背景阅读,重点关注BEV融合逻辑与数据闭环构建方法,并可延伸研究相关企业在舱泊一体等场景的应用实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值