读书笔记《深入理解Java虚拟机》 (三)垃圾回收器与内存分配策略

本文详细解析了Java中对象的回收策略,包括引用计数算法的问题、可达性分析算法的工作原理,以及不同类型的引用。介绍了垃圾收集算法如标记-清除、复制算法和标记-整理算法的特点与应用。同时,探讨了分代收集算法如何根据不同对象的存活周期优化内存管理和回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象是否可回收(指那些不可能再被任何途径使用的对象)

  • 引用计数算法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时就减1;当等于0时就认为对象不可能再被使用。问题:当两个对象相互引用时,就无法回收了。   jvm没有使用这个算法判断对象是否应该回收。

  • 可达性分析算法

通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连,则证明对象是不可用的。

可作为GCRoots的对象包括下面几种:

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  2. 方法区中类静态属性引用的对象。
  3. 方法区中常量引用的对象。
  4. 本地方法栈中JNI(Native方法)引用的对象。

引用的种类

  • 强引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象,类似“Object obj = new Object()”
  • 软引用,SoftReference,描述一些有用,但是非必需的对象,在系统将要发生内存溢出异常前会将此类引用列入回收范围进行第二次回收。
  • 弱引用,WeekReference,被弱引用关联的对象只能生存到下一次垃圾收集,无论当前内存是否足够。
  • 虚引用,PhantomReference,无法通过虚引用来取得一个对象实例。为一个对象设置虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

对象的自我拯救

重写finalize()方法,一个对象只能执行一次。强烈不建议使用。 

方法区的回收(永久代)

垃圾收集率低, 常量池中的无用常量、无用类就算达到了回收条件也未必一定会被回收。

垃圾收集算法

  • 标记 — 清除算法

首先标记出所有需要回收的对象,在标记完成后统一回收。不足:效率低;会产生大量不连续的内存碎片。空间碎片太多可能会导致以后在程序运行过程中分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

  • 复制算法

将内存块划分为容量大小相同的两块,每次只使用其中的一块,当这块内存用完时,就将这块内存中还存活的对象复制到另外一块内存中,并将当前内存块清理掉。实现简单,运行高效。但是内存缩小一半,代价太高了。

  • 标记 — 整理算法

首先标记出所有需要回收的对象, 然后把还存活的对象向一端移动,然后清理存活对象边界以外的空间。

  • 分代收集算法

根据对象存活周期的不同将内存划分为几块。 一般分为新生代和老年代。

新生代每次垃圾回收都会有大批对象死去,所以选用复制算法,存活对象少, 复制成本低。

老年代中对象存活率高,没有额外的空间对它进行分配担保,所以就使用“标记 —清理”或者“标记 — 整理”算法来进行回收。

 

内存分配与回收策略

  • 对象优先在Eden分配

大多数情况下,对象再新生代Eden区中分配。当Eden区中没有足够空间时,虚拟机会出发一次Minor GC(新生代GC)。

  • 大对象直接进入老年代

大对象是指需要大量连续内存空间的Java对象,比如很长的字符串以及数组。抵制String用加号多次拼接吧。大对象大多的话, 会增加提前触发垃圾收集的几率。

  • 长期存活的对象将进入老年代

虚拟机给每个对象定义了个年龄计数器,每经过一次新生代GC(Minor GC)还存活的话, 那年龄计数器就加1岁,直到增加到一定程度(默认为15岁),就会移动到老年代中。

  • 动态对象年龄判定

如果在Survivor空间中相同年龄所有对象的大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

空间分配担保

在发生新生代GC之前,虚拟机会先检查老年代最大可用空间是否大于新生代对象的总空间,如果不大于,则担保失败。如果允许担保失败,那么新生代GC有可能会失败,因为新生代GC需要复制出来的存活对象不能确定大小。当不允许担保失败或者新生代GC失败,会触发Full GC。一般是允许担保失败,来减少Full GC的次数。

 

 

内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的维超分辨成像。文章不仅涵盖了系统硬件的设计实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
内容概要:本文详细介绍了基于Seggiani提出的渣层计算模型,针对Prenflo气流床气化炉中炉渣的积累和流动进行了模拟。模型不仅集成了维代码以提供气化炉内部的温度和浓度分布,还探讨了操作条件变化对炉渣行为的影响。文章通过Python代码实现了模型的核心功能,包括炉渣粘度模型、流动速率计算、厚度更新、维模型的集成以及可视化展示。此外,还扩展了模型以考虑炉渣组成对特性的影响,并引入了Bingham流体模型,更精确地描述了含未溶解颗粒的熔渣流动。最后,通过实例展示了氧气-蒸汽流量增加2%时的动态响应,分析了温度、流动特性和渣层分布的变化。 适合人群:从事煤气化技术研究的专业人士、化工过程模拟工程师、以及对工业气化炉操作优化感兴趣的科研人员。 使用场景及目标:①评估不同操作条件下气化炉内炉渣的行为变化;②预测并优化气化炉的操作参数(如温度、氧煤比等),以防止炉渣堵塞;③为工业气化炉的设计和操作提供理论支持和技术指导。 其他说明:该模型的实现基于理论公式和经验数据,为确保模型准确性,实际应用中需要根据具体气化炉的数据进行参数校准。模型还考虑了多个物理场的耦合,包括质量、动量和能量守恒方程,能够模拟不同操作条件下的渣层演变。此外,提供了稳态求解器和动态模拟工具,可用于扰动测试和工业应用案例分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值