常见的垃圾收集算法(标记-清除、复制、标记-整理)

在Java虚拟机(JVM)及其他类似环境中,垃圾收集是自动管理内存的关键环节。以下是三种常见的垃圾收集算法:标记-清除、复制、以及标记-整理。

一、标记-清除算法(Mark-Sweep)

标记-清除算法是一种基础且直观的垃圾收集方法。它主要分为两个阶段:

  1. 标记阶段:从根对象(如栈中的引用、静态变量等)开始,垃圾回收器遍历对象图,标记所有可以从根对象访问到的存活对象。标记的方式可以通过追踪对象引用关系、遍历对象图等方式实现。
  2. 清除阶段:在标记完成后,垃圾回收器遍历整个堆内存,清除所有未被标记(即不可达)的对象。这些被清除的对象所占用的内存空间将被标记为可用,并可以重新分配给新的对象。

优点

  • 实现简单,不需要移动对象。
  • 可以处理任意形状和大小的对象。

缺点

  • 标记和清除过程可能导致较长的停顿时间,影响应用程序的响应性。
  • 清除阶段会留下不连续的内存空间,导致内存碎片化。这可能会增加内存分配的复杂性,降低内存利用率。

二、复制算法(Copying)

复制算法通过将内存划分为两个相等的区域(通常称为From空间和To空间)来避免内存碎片问题。每次只使用其中一个区域,当该区域内存满时,垃圾回收器会将存活的对象复制到另一个区域,并清空当前区域。

优点

  • 解决了内存碎片问题,因为每次复制后内存都是连续的。
  • 复制过程中可以并行处理,提高垃圾收集的效率。

缺点

  • 内存利用率低,因为每次只能使用一半的内存空间。
  • 在存活对象较多时,复制操作会消耗较多的时间和资源。

三、标记-整理算法(Mark-Compact)

标记-整理算法结合了标记-清除算法和复制算法的优点,并克服了它们的缺点。它同样分为标记阶段和整理阶段:

  1. 标记阶段:与标记-清除算法相同,从根对象开始遍历对象图,标记所有存活对象。
  2. 整理阶段:让所有存活的对象都向内存的一端移动(通常是内存的低地址端),然后直接清理掉端边界以外的内存。这样,存活的对象在内存中就是连续的,避免了内存碎片问题。

优点

  • 解决了内存碎片问题。
  • 内存利用率高,因为可以充分利用整个内存空间。

缺点

整理阶段需要移动对象,这可能会导致额外的开销。但在现代JVM中,这种开销通常是可以接受的。

本人介绍:

爱编程、写作的小菜鸡,喜交天下各路英雄好友,欢迎关注本人公众号一起学习、交流。如果您遇到什么问题请给我留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值