Skip to main content

Command Palette

Search for a command to run...

Jvm中gc的算法演进

Published
1 min read

垃圾回收是JVM的一大功能模块,面试中经常会被问到有哪些垃圾回收算法,那么这些垃圾回收算法是如何被设计出来的呢?首先要回到根本的问题上来。

问题的起源:为何需要垃圾回收

在早期编程语言中,程序员需要手动管理内存:分配内存并在不需要时释放。这一过程容易出错,导致内存泄漏(未被释放的内存)或悬挂指针(指向已释放内存的指针),严重影响程序稳定性和性能。为解决这些问题,垃圾回收机制应运而生,目的是自动检测并回收不再被程序使用的内存。

1. 标记-清除算法(Mark-Sweep)

JVM堆内存用于存储Java对象,对于堆内存如何管理就需要有些考究了,首先有一块空白内存等待被使用。当新对象需要被分配空间的话,我们可以采用简单直接的遍历方式按需分配即可,等到分配的对象不需要时,则需要清理对应空间,后面再创建新对象时可以使用已回收空间,这就是我们直接想到的标记-清除算法:

这种方法简单直接,但它的问题是内存碎片化,零碎的内存多了,当一个新的大的对象要创建时,会遇到连续的空间不够的情况,这就需要对已经存活的对象进行迁移地址,这影响到了内存分配效率。

2. 复制算法(Copying)

为解决内存碎片问题,复制算法被引入。它将内存分为两个相等的区域,每次只使用其中一个。垃圾回收时,算法会将活动对象从当前区域复制到另一个区域,然后清除当前区域的所有对象,从而避免碎片化。

赋值算法依然有其局限性:

  1. 内存利用率:复制算法需要将内存分成两个区域,一次只使用其中一个区域来存放对象。这意味着在任何时刻,有一半的内存空间不被利用,从而降低了内存的有效利用率。

  2. 对象复制开销:虽然复制存活对象到另一区域可以避免碎片化,但这个过程需要复制对象,并更新引用这些对象的所有指针。对于存活对象较多的场景,这种复制动作可能会带来不小的性能开销。

这就导致在遇到大对象(涉及到对象不断复制复制)、对象多的情况下,也会有性能问题。

3. 分代收集算法

分代收集算法基于这样一个观察:不同对象的生命周期不同。因此,JVM的内存被划分为年轻代(Young Generation)和老年代(Old Generation),以不同的方式管理不同寿命的对象。

  • 年轻代:新创建的对象首先被分配到年轻代。年轻代进一步细分为Eden区、From Survivor区和To Survivor区。大部分对象在这里被快速回收。

  • 老年代:经过多次垃圾回收依然存活的对象,会被移动到老年代。老年代的对象生命周期较长,垃圾回收频率较低。

4. Eden区、From、To区

  • Eden区:新生成的对象首先被分配到这里。

  • From和To Survivor区:用于实现复制算法的一部分。在每次年轻代垃圾回收时,存活的对象会从Eden区和一个Survivor区(例如From)复制到另一个Survivor区(例如To),然后清空Eden区和之前的From Survivor区。

5. 标记-整理算法(Mark-Compact)

用于老年代的标记-整理算法,它在标记阶段后不是简单地清除未标记对象,而是将所有存活的对象移动到内存的一端,然后清理边界以外的内存,从而解决内存碎片问题,适用于老年代中对象生命周期较长的特点。

结论

JVM的垃圾回收机制通过引入复制算法、分代收集算法、Eden区、From/To区的概念,以及标记-整理算法等技术,有效地解决了内存管理中的关键问题,如自动内存回收、内存碎片化,以及不同生命周期对象的高效管理。这些技术的引入,是基于对程序内存使用模式的深入理解和长期观察的结果,目的是优化内存回收过程,提高程序性能和稳定性。

More from this blog

迟到的年终总结

要给2月画上一个句号了,今天是24年2月29号,实际上,我想写的是我23年的年终总结。 距离元旦,已经过去2个月了,具体春节,也已经有20天,想一想还是记录下自己的2023。 2023年开始,自己身上的责任多了一份——有了一个可爱的女儿,同时也有了一份当父亲的幸福,不需要多做什么,看着她就觉得生活的美好,和她在一起就会感到幸福和快乐,她生病时,会感到焦虑急躁,希望她一切都好,这愿望有点理想,也许经历本身就是美好。 大概4/5月份的时候,开始了一些奔波,老家、北京每周跑一趟,直到7月底从北京搬家,...

Feb 29, 20241 min read

活在当下与正念

我们经常说要活在当下,意思好像是在表达我们经常并没有活在当下,那么活在当下到底意味着什么?如何才能活在当下呢? 简单来讲,活在当下是说无需对未来的不确定性过多焦虑,回归内心的平静。我们都知道“焦虑”并不能解决问题,让内心平静、克服自己的情绪、理性思考、积极行动才是正确的生活态度与方式,但是我们对自己一味强硬地要求,发出指令施以控制,却并不能让自己回归平静状态。想要控制往往会适得其反,会让在一些无所谓的事情上花费更多精力,甚至上瘾,比如说对手机上瘾。关于这种现象的一种解释是我们对自我的控制系统是脆...

Jul 23, 20231 min read

计算机网络基础(一)

计算机网络研究的本质问题:计算机之间的信息传递。现在让我们站在一个设计者的角度,假设没有计算机网络的时候,考虑如何实现这样的目的。 首先,将问题简化为2台计算机要想实现通信,首先可以想到的是,用一根线连接2台计算机,通过它来实现信息的传递。那这个线就被叫作介质。这里介质的选择,可以是光纤、同轴电缆等。而数据是需要通过转换为物理信号来进行传递的,计算中的0 1组合通过编码转换为电信号,然后再通过介质进行传递,接收方接收到电信号,再通过解码转换为0 1组合,完成传递。完成编解码的工具就是调制解调器。...

Jul 14, 20231 min read

计算机基础-笔记:内存管理

英特尔x86架构的内存划分主要包括实模式和保护模式两种模式。 实模式是一种兼容早期x86处理器的模式,它允许程序直接访问物理内存。在实模式下,内存被划分为若干个64KB的段,每个段有一个段基地址和一个段限长,程序可以通过偏移量来访问段内的任意地址。但是实模式下没有任何内存保护措施,程序可以随意访问所有内存地址,这会导致很多安全问题和稳定性问题。 保护模式是一种更高级别的模式,它提供了更多的内存保护和安全性。在保护模式下,内存被划分为若干个分页的虚拟地址空间,每个虚拟地址被映射到物理内存中的一个物...

Mar 26, 20231 min read

Flash's blog

10 posts