4.9 说一下 JVM 有哪些垃圾回收算法?

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

标记-清除算法(Mark-Sweep)是一种常见的垃圾回收算法,它分为两个阶段:标记阶段和清除阶段。

在标记阶段,垃圾回收器会从根对象(通常是一些全局变量)开始遍历程序的对象图,标记所有可达对象,即所有可以从根对象到达的对象,而不可达的对象则被视为垃圾。

在清除阶段,垃圾回收器会清理所有不可达对象,并回收它们所占用的内存空间,从而保证内存的有效利用。

标记-清除算法的主要优点是简单、高效

它也存在一些缺点。
首先,标记-清除算法会造成内存碎片,当需要为新对象分配内存时,可能需要进行多次碎片整理操作,导致内存分配效率降低。

其次,标记-清除算法可能会导致程序停顿时间较长,因为清除不可达对象需要遍历整个堆,当堆较大时,清除时间会很长,从而导致程序停顿。

2 复制算法(Copying Algorithm)

Java中的复制算法属于新生代垃圾回收算法,通常用于回收新生代(Young Generation)中的对象。这个算法将堆内存划分为两个相同大小的区域,每次只使用其中一个区域,当这个区域用完之后,将其中的存活对象复制到另一个区域中,然后清空之前的区域。这样,在新的区域中,存活对象的地址是连续的,从而可以很方便地进行内存分配。

具体来说,Java将新生代分为三个区域,分别是Eden区、Survivor0区和Survivor1区。当一个对象被创建时,它首先被放置在Eden区。当Eden区满时,所有存活的对象会被复制到Survivor0区,然后清空Eden区。之后,在Eden区和Survivor0区之间进行垃圾回收时,所有存活的对象会被复制到Survivor1区,然后清空Eden区和Survivor0区。最后,将Survivor1区作为新的Survivor0区。这样,新生代中的存活对象就得以转移到下一代,而未存活的对象就会被清理掉。

Java的复制算法有以下几个优点:

内存分配速度快。因为每次分配内存时只需在当前使用的区域中简单地移动一个指针,所以分配速度非常快。

没有内存碎片。因为每次垃圾回收时只需将存活对象复制到新的区域中,所以不会出现内存碎片的情况。

不过,Java的复制算法也有一个缺点,就是需要额外的空间来保存复制后的对象。这就意味着,当存活对象占用的空间超过了可用空间的一半时,就需要进行一次垃圾回收。

3 标记-整理算法(Mark-Compact)

标记-整理算法(Mark-Compact)是一种常见的垃圾回收算法,主要用于老年代的垃圾回收。它通过将所有存活对象向一端移动,然后清理掉端边界以外的内存来解决内存碎片问题。

具体来说,标记-整理算法主要分为两个阶段:标记和整理。

标记阶段:与标记-清除算法类似,标记-整理算法也需要先标记出所有存活对象,以便在后续的整理阶段中移动这些对象。

整理阶段:在整理阶段中,所有存活的对象会被移动到内存的一端,然后清理掉端边界以外的内存。这样,就可以将所有存活对象集中在一起,从而解决内存碎片的问题。

需要注意的是,标记-整理算法中需要大量的移动对象操作,因此它的性能通常比复制算法差一些,尤其是在老年代的内存回收中。但是,由于它可以解决内存碎片问题,因此在老年代的内存回收中还是比较常用的。

4 分代算法(Generational Collection)

分代算法(Generational Collection)是一种常见的垃圾回收算法,它基于这样一个事实:大部分对象的生命周期都很短暂,而只有一小部分对象会存活很长时间。

分代算法将内存分为多个代(Generation),通常是新生代(Young Generation)、老年代(Old Generation)和持久代(Permanent Generation)三个代。新生代用复制算法,老年代用标记-整理或标记-清除算法,持久代用标记-清除算法。

具体来说,新生代中的对象一般很快就会变成垃圾,因此采用复制算法进行垃圾回收,将新生代分为 Eden 区和两个 Survivor 区(通常为 S0 和 S1)。当 Eden 区满时,会触发 Minor GC,将存活的对象复制到 Survivor 区,同时清空 Eden 区。当某个 Survivor 区满时,会将其中的存活对象复制到另一个 Survivor 区,同时清空该 Survivor 区。

老年代中的对象存活时间较长,采用标记-整理或标记-清除算法进行垃圾回收。当老年代中的内存空间不足时,会触发 Full GC,进行全局垃圾回收,包括新生代和老年代。

持久代中的对象主要是一些 Class、Method 等元数据,因此采用标记-清除算法进行垃圾回收。

分代算法的优点是可以充分利用对象生命周期的特点,将不同生命周期的对象放在不同的代中,对每个代采用不同的垃圾回收算法,提高了垃圾回收效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值