JAVA的几个垃圾回收器及对应的算法和算法的底层逻辑

本文详细介绍了Java虚拟机中的几种常见垃圾回收器,包括SerialGC、ParallelGC、CMSGC、G1GC、EpsilonGC和ZGCGC,阐述了各自的算法、优缺点以及适用场景。根据应用需求选择合适的垃圾回收器是关键,如单核/多核环境、速度与延迟要求等。

Java 虚拟机 (JVM) 使用垃圾回收器 (GC) 来回收不再使用的对象所占用的内存空间。JVM 提供了多种垃圾回收器,每种都使用不同的算法来进行垃圾回收。

以下是一些常见的 Java 垃圾回收器及其对应的算法:

1. Serial GC:

  • 算法:串行复制算法
  • 特点:简单易行,但效率低下,适用于单核处理器环境

串行复制算法是一种垃圾回收算法,它通过复制对象来回收内存空间。该算法主要包括以下步骤:

1. 标记阶段:

  • 将所有对象标记为白色。
  • 从根对象开始,遍历所有可达的对象,并将它们标记为黑色。
  • 所有未标记的对象都是不可达的,可以被回收。

2. 复制阶段:

  • 创建一个新的内存空间。
  • 将所有黑色对象复制到新的内存空间中。
  • 将旧的内存空间中的所有对象标记为灰色。
  • 将所有灰色对象复制到新的内存空间中。
  • 复制完成后,所有可达对象都将位于新的内存空间中,旧的内存空间中的所有对象都可以被回收。

以下是串行复制算法的底层逻辑:

  • 该算法通过复制对象来回收内存空间。
  • 该算法只会复制可达对象,不可达对象不会被复制。
  • 该算法可以有效地回收内存空间,但会增加应用程序的暂停时间。

串行复制算法具有以下优点:

  • 该算法简单易行,易于实现。
  • 该算法能够有效地回收内存空间。

串行复制算法也有一些缺点:

  • 该算法会增加应用程序的暂停时间。
  • 该算法不适用于大型堆。

2. Parallel GC:

  • 算法:并行复制算法
  • 特点:并行执行垃圾回收,提高效率,适用于多核处理器环境

并行复制算法是一种垃圾回收算法,它通过并行复制对象来回收内存空间。该算法主要包括以下步骤:

1. 标记阶段:

  • 将所有对象标记为白色。
  • 从根对象开始,并行遍历所有可达的对象,并将它们标记为黑色。
  • 所有未标记的对象都是不可达的,可以被回收。

2. 复制阶段:

  • 创建一个新的内存空间。
  • 并行将所有黑色对象复制到新的内存空间中。
  • 将旧的内存空间中的所有对象标记为灰色。
  • 并行将所有灰色对象复制到新的内存空间中。
  • 复制完成后,所有可达对象都将位于新的内存空间中,旧的内存空间中的所有对象都可以被回收。

以下是并行复制算法的底层逻辑:

  • 该算法通过并行复制对象来回收内存空间。
  • 该算法只会复制可达对象,不可达对象不会被复制。
  • 该算法可以有效地回收内存空间,同时减少应用程序的暂停时间。

并行复制算法具有以下优点:

  • 该算法能够并行执行,提高效率。
  • 该算法能够有效地回收内存空间。
  • 该算法比串行复制算法减少了应用程序的暂停时间。

并行复制算法也有一些缺点:

  • 该算法需要额外的线程来进行并行复制,可能会增加应用程序的资源消耗。
  • 该算法不适用于大型堆。

3. CMS GC:

  • 算法:标记-清除算法 + 标记-整理算法
  • 特点:适用于老年代,能够减少内存碎片

标记-清除算法标记-整理算法 都是垃圾回收算法,它们可以相互结合使用来回收内存空间。

标记-清除算法 的底层逻辑如下:

  1. 标记阶段:

    • 将所有对象标记为白色。
    • 从根对象开始,遍历所有可达的对象,并将它们标记为黑色。
    • 所有未标记的对象都是不可达的,可以被回收。
  2. 清除阶段:

    • 扫描所有对象,回收所有标记为白色(不可达)的对象所占用的内存空间。

标记-整理算法 的底层逻辑如下:

  1. 标记阶段:

    • 与标记-清除算法相同。
  2. 整理阶段:

    • 将所有黑色对象移动到内存空间的另一部分。
    • 将所有白色对象标记为灰色。
    • 将所有灰色对象移动到黑色对象的后面。
    • 整理完成后,所有黑色对象都将位于内存空间的连续区域中,空闲空间将位于黑色对象的后面。

结合使用

标记-清除算法和标记-整理算法可以结合使用,以提高垃圾回收的效率。

  • 标记-清除算法可以快速回收大部分不可达的对象。
  • 标记-整理算法可以整理内存空间,减少内存碎片。

总结

  • 标记-清除算法 + 标记-整理算法可以有效地回收内存空间。
  • 标记-清除算法可以快速回收大部分不可达的对象。
  • 标记-整理算法可以整理内存空间,减少内存碎片。

4. G1 GC:

  • 算法:基于区域的垃圾回收算法
  • 特点:能够并行回收整个堆,适用于大型堆

基于区域的垃圾回收算法是一种垃圾回收算法,它将堆划分为多个区域,并对每个区域进行单独的垃圾回收。该算法主要包括以下步骤:

1. 区域划分:

  • 将堆划分为多个区域,每个区域具有相同的大小和用途。
  • 例如,可以将堆划分为新生代区域、老年代区域和永久代区域。

2. 对象分配:

  • 当需要分配新的对象时,从年轻区域分配空间。
  • 如果年轻区域空间不足,则将对象分配到老年代区域。
  • 永久代区域用于存储永久存活的对象,不会被垃圾回收。

3. 垃圾回收:

  • 当年轻区域空间不足时,会触发年轻代垃圾回收。
  • 年轻代垃圾回收会回收所有不可达的对象,并将存活的对象晋升到老年代区域。
  • 老年代垃圾回收会回收所有不可达的对象,并将存活的对象移动到老年代区域的另一个区域。

4. 区域合并:

  • 当老年代区域空间不足时,会触发老年代垃圾回收。
  • 老年代垃圾回收会回收所有不可达的对象,并将存活的对象移动到老年代区域的另一个区域。
  • 如果老年代区域的两个区域都满了,则会将它们合并成一个区域。

以下是基于区域的垃圾回收算法的底层逻辑:

  • 该算法将堆划分为多个区域,并对每个区域进行单独的垃圾回收。
  • 该算法可以提高垃圾回收的效率,减少内存碎片。

基于区域的垃圾回收算法具有以下优点:

  • 该算法可以提高垃圾回收的效率,减少内存碎片。
  • 该算法能够并行执行,提高效率。

基于区域的垃圾回收算法也有一些缺点:

  • 该算法需要额外的内存空间来存储区域信息。
  • 该算法可能导致内存碎片,特别是在老年代区域。

5. Epsilon GC:

  • 算法:并行标记-清除算法
  • 特点:适用于新生代,能够快速回收垃圾

并行标记-清除算法是一种垃圾回收算法,它通过并行标记和清除对象来回收内存空间。该算法主要包括以下步骤:

1. 标记阶段:

  • 将所有对象标记为白色。
  • 从根对象开始,并行遍历所有可达的对象,并将它们标记为黑色。
  • 所有未标记的对象都是不可达的,可以被回收。

2. 清除阶段:

  • 并行扫描所有对象,回收所有标记为白色(不可达)的对象所占用的内存空间。

以下是并行标记-清除算法的底层逻辑:

  • 该算法通过并行标记和清除对象来回收内存空间。
  • 该算法只会回收不可达对象,可达对象不会被回收。
  • 该算法可以有效地回收内存空间,同时减少应用程序的暂停时间。

并行标记-清除算法具有以下优点:

  • 该算法能够并行执行,提高效率。
  • 该算法能够有效地回收内存空间。
  • 该算法比串行标记-清除算法减少了应用程序的暂停时间。

并行标记-清除算法也有一些缺点:

  • 该算法需要额外的线程来进行并行标记和清除,可能会增加应用程序的资源消耗。
  • 该算法不适用于大型堆。

以下是一些关于并行标记-清除算法的额外信息:

  • Epsilon GC 垃圾回收器使用并行标记-清除算法来回收新生代的对象。
  • ZGC GC 垃圾回收器使用并行标记-清除算法来回收老年代的对象。

6. ZGC GC:

  • 算法:基于色的标记-整理算法
  • 特点:能够在不暂停应用程序的情况下进行垃圾回收,适用于对延迟敏感的应用程序

基于色的标记-整理算法是一种垃圾回收算法,它使用颜色来标记对象,并通过整理内存空间来回收空闲空间。该算法主要包括以下步骤:

1. 标记阶段:

  • 将所有对象标记为白色。
  • 从根对象开始,遍历所有可达的对象,并将它们标记为黑色。
  • 所有未标记的对象都是不可达的,可以被回收。

2. 整理阶段:

  • 将所有黑色对象移动到内存空间的另一部分。
  • 将所有白色对象标记为灰色。
  • 将所有灰色对象移动到黑色对象的后面。
  • 整理完成后,所有黑色对象都将位于内存空间的连续区域中,空闲空间将位于黑色对象的后面。

以下是基于色的标记-整理算法的底层逻辑:

  • 该算法使用颜色来标记对象,以便区分可达对象和不可达对象。
  • 可达对象是指从根对象可以访问到的对象。
  • 不可达对象是指无法从根对象访问到的对象。
  • 该算法通过整理内存空间来回收空闲空间。
  • 整理内存空间是指将所有可达对象移动到内存空间的连续区域中,并将空闲空间移动到可达对象的后面。

基于色的标记-整理算法具有以下优点:

  • 该算法能够有效地回收内存空间。
  • 该算法能够减少内存碎片。
  • 该算法能够并行执行,提高效率。

基于色的标记-整理算法也有一些缺点:

  • 该算法需要额外的内存空间来存储颜色信息。
  • 该算法的整理阶段可能会导致应用程序暂停。

总结:

  • 垃圾回收算法可以分为两类:标记-清除算法和标记-整理算法。
  • 标记-清除算法会标记所有不再使用的对象,然后清除它们所占用的内存空间。
  • 标记-整理算法会标记所有不再使用的对象,然后将它们移动到内存空间的另一部分,以便可以回收空闲空间。
  • JVM 会根据应用程序的需要选择合适的垃圾回收算法。

以下是一些选择垃圾回收器的建议:

  • 对于单核处理器环境,可以选择 Serial GC。
  • 对于多核处理器环境,可以选择 Parallel GC 或 G1 GC。
  • 对于需要快速回收垃圾的应用程序,可以选择 Epsilon GC。
  • 对于对延迟敏感的应用程序,可以选择 ZGC GC。

注意:

  • JVM 可能会在未来版本中引入新的垃圾回收器。
  • 建议您根据应用程序的需要选择合适的垃圾回收器,并定期监控应用程序的 GC 性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值