笔记--垃圾收集器与内存分配策略

Java垃圾回收机制详解
本文详细介绍了Java中对象的生死判定方法,包括引用计数算法、可达性分析算法及各种引用类型;阐述了垃圾收集算法,如标记-清除、复制算法、标记-整理算法,并解释了分代收集的概念。此外,还深入探讨了HotSpot虚拟机的具体实现。

1 对象生死判定方法

1.1引用计数算法

    实现简单,效率高,当java虚拟机并没有使用它,因为它很难解决对象之间相互循环引用问题

1.2可达性分析算法

    以“GC Roots”的对象为起始点,从这些节点向下搜索,当一个对象到GC Roots没有任何引用链相连,证明该对象不可用


可作为GC Roots 当对象包括:

虚拟机栈中引用的对象,包括栈帧中当本地变量表

方法区中的类静态属性引用的对象

方法区中常量引用的对象

本地方法栈中JNI(本地方法)引用的对象

1.3 引用

强引用:类似于“Ojbject object = new Object()”这类的引用,只要强引用存在,它永远不会被回收

软引用:有用但并非必需的对象。在系统将要发生内存溢出异常时,这类引用才会被回收。SoftReference类可实现。

弱引用:被弱引用引用的对象只能生存到下一次垃圾回收之前。WeakReference类可实现。

虚引用:设置虚引用关联的唯一目的是能在这个对象被垃圾收集器回收时能收到一个系统通知

各种引用的具体作用参考:http://www.cnblogs.com/E-star/p/3441846.html

1.4 生存还是死亡

    即使在可达性分析算法中不可达的对象,也并非非死不可。

    若在上述算法中不可达,他会被第一次标记并进行筛选。筛选的条件是该对象是否有必要执行finalize()方法。当对象没有覆盖该方法,或是该对象已经执行过一次该方法,那么虚拟机将认为它没有必要执行该方法。若没有必要执行该方法,则它将在第二次标记之后被真正地彻底回收。若被判定有必要执行该方法,则将会被放进一个队列中,在另一个低优先级的线程中执行,但不保证一定执行,若在该方法执行过程中,该对象把自己(this)赋值给某个类变量或者对象成员变量,那么第二次标记的时候它将被移出“即将回收”的集合。但不建议实现finalize()方法。

1.5 回收方法区

    常规应用进行一次垃圾收集一般可以回收70%~95%的空间,而永久代的垃圾回收效率远低于此。

    永久代的垃圾手机主要回收两部分内容:废弃常量和无用的类。

    废弃常量的判定相对简单。比如一个字符串常量在任何String对象都没有对其进行引用,则其就是废弃常量。而“无用的类”的判定则需要满足以下几个条件:

    (1)该类的所有实例都已经被回收;(2)加载该类的ClassLoader也已经被回;(3)该类对应的java.lang.class对象没有在任何地方被应用,无法在任何地方通过反射机制访问该类的方法。

    虚拟机“可以”对满足上述条件的类进行回收,但并不是必然会进行回收。是否对类进行回收,HotSpot虚拟机提供了-Xnoclassgc参数等进行控制。

注:在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备卸载的功能,以保证永久代不会溢出。

2 垃圾收集算法

2.1标记-清除算法

    两个不足:效率问题,标记和清除的效率都不高;空间问题,会产生大量的空间碎片,导致当大对象需要分配内存时没有连续的内存空间可以使用。

2.2 复制算法

    实现简单,运行高效。现在的商业虚拟机都采用这种手机算法来回收新生代。将内存分为一个较大的Eden空间和两块较小的Survivor空间。由于大部分的新生代对象都是“朝生夕死”,当回收时,将较大空间Eden空间和已经使用过的那一个Survivor空间中还存活的对象一次性复制到另外一块Survivor空间中,最后清理掉另外的两块空间,但Survivor空间不够用时,就需要依赖其他内存(这里指老年代对其进行分配担保)。在HotSpot中,Eden和Survivor默认分配空间的比例为8:1。

2.3 标记-整理算法

     因为在老年代中每次回收存活下来的对象所占比例较大,因此一般不采取复制算法。而采用标记-整理算法。

2.4 分代收集算法

    无具体新实现,只是根据对象存活周期的不同将内存划分为几块。一般将Java堆中的对象分为新生代还有老年代,根据各个年代的特点采用最适当的收集算法。

    在新生代中,每次垃圾收集时都有大批的对象死去,只有少数存活,所以采用复制算法。

    而在老年代中因为对象存活率高、没有额外空间对它进行担保,就必须采用标记--清除或者标记--整理算法。

3 HotSpot的算法实现

3.1 枚举根节点

    可达性分析在执行时需要确保分析工作的一致性,而保证一致性就得将应用进行停顿直至分析完成。因为目前的主流虚拟机都采用准确式GC,所以Java虚拟机知道在哪里存在着对象的引用,而不用一个不漏地检查完所有执行上下文和全局的引用位置,在HotSpot的实现中,使用的时OopMap的数据结构来实现这一目的的。

3.2 安全点

    OopMap数据结构并非时每执行一句指令便生成,它只会在特定的位置生成,这些特定的位置叫安全点。选取安全点的标准是“是否具有让程序长时间执行的特征”,长时间执行最明显的特征就是指令序列的复用,例如方法调用、循环跳转、异常跳转等,具有这些功能的指令才会产生OopMap。

    对于Safepoint的另一个需要思考的问题是如何在GC发生时让所有的线程(不包括JNI调用的线程)都“跑”到最近的安全点上停下来。共有两种方案:抢断式中断还有主动式中断。

    抢断式中断:不需要线程的执行代码去配合,在GC发生时。首先把所有的线程都中断,如果发生有线程中断的地方不在安全点上,就恢复线程,让它跑到安全点上。现在几乎没有虚拟机采用这种方式。

    主动式中断:当GC需要中断线程的时候,不直接对线程进行操作,仅仅简单地设置一个标志,各个线程执行的时候去轮询这个标志是否为真,发现中断标志为真时就自己中断挂起,轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。

3.3 安全区域

    安全区域是指在一段代码片段中,引用关系不会发生变化。在这个区域的任何一个地方开始GC都是安全的,可以把Safe Region看做是被扩展了的Safepoint。在线程执行到Safe Region中的代码时,首先标识自己已经进入了安全区域,那样在这段时间JVM要发起GC的时候,就不用管标识自己为Safe Region状态的线程了。若在该时间段系统进入了GC,该线程必须等待系统完成GC收到可以安全离开安全区域的信号才可继续执行。









内容概要:本文介绍了一个基于多传感器融合的定位系统设计方案,采用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、付费专栏及课程。

余额充值