Java 虚拟机 (JVM) 使用垃圾回收器 (GC) 来回收不再使用的对象所占用的内存空间。JVM 提供了多种垃圾回收器,每种都使用不同的算法来进行垃圾回收。
以下是一些常见的 Java 垃圾回收器及其对应的算法:
1. Serial GC:
- 算法:串行复制算法
- 特点:简单易行,但效率低下,适用于单核处理器环境
串行复制算法是一种垃圾回收算法,它通过复制对象来回收内存空间。该算法主要包括以下步骤:
1. 标记阶段:
- 将所有对象标记为白色。
- 从根对象开始,遍历所有可达的对象,并将它们标记为黑色。
- 所有未标记的对象都是不可达的,可以被回收。
2. 复制阶段:
- 创建一个新的内存空间。
- 将所有黑色对象复制到新的内存空间中。
- 将旧的内存空间中的所有对象标记为灰色。
- 将所有灰色对象复制到新的内存空间中。
- 复制完成后,所有可达对象都将位于新的内存空间中,旧的内存空间中的所有对象都可以被回收。
以下是串行复制算法的底层逻辑:
- 该算法通过复制对象来回收内存空间。
- 该算法只会复制可达对象,不可达对象不会被复制。
- 该算法可以有效地回收内存空间,但会增加应用程序的暂停时间。
串行复制算法具有以下优点:
- 该算法简单易行,易于实现。
- 该算法能够有效地回收内存空间。
串行复制算法也有一些缺点:
- 该算法会增加应用程序的暂停时间。
- 该算法不适用于大型堆。
2. Parallel GC:
- 算法:并行复制算法
- 特点:并行执行垃圾回收,提高效率,适用于多核处理器环境
并行复制算法是一种垃圾回收算法,它通过并行复制对象来回收内存空间。该算法主要包括以下步骤:
1. 标记阶段:
- 将所有对象标记为白色。
- 从根对象开始,并行遍历所有可达的对象,并将它们标记为黑色。
- 所有未标记的对象都是不可达的,可以被回收。
2. 复制阶段:
- 创建一个新的内存空间。
- 并行将所有黑色对象复制到新的内存空间中。
- 将旧的内存空间中的所有对象标记为灰色。
- 并行将所有灰色对象复制到新的内存空间中。
- 复制完成后,所有可达对象都将位于新的内存空间中,旧的内存空间中的所有对象都可以被回收。
以下是并行复制算法的底层逻辑:
- 该算法通过并行复制对象来回收内存空间。
- 该算法只会复制可达对象,不可达对象不会被复制。
- 该算法可以有效地回收内存空间,同时减少应用程序的暂停时间。
并行复制算法具有以下优点:
- 该算法能够并行执行,提高效率。
- 该算法能够有效地回收内存空间。
- 该算法比串行复制算法减少了应用程序的暂停时间。
并行复制算法也有一些缺点:
- 该算法需要额外的线程来进行并行复制,可能会增加应用程序的资源消耗。
- 该算法不适用于大型堆。
3. CMS GC:
- 算法:标记-清除算法 + 标记-整理算法
- 特点:适用于老年代,能够减少内存碎片
标记-清除算法 和 标记-整理算法 都是垃圾回收算法,它们可以相互结合使用来回收内存空间。
标记-清除算法 的底层逻辑如下:
标记阶段:
- 将所有对象标记为白色。
- 从根对象开始,遍历所有可达的对象,并将它们标记为黑色。
- 所有未标记的对象都是不可达的,可以被回收。
清除阶段:
- 扫描所有对象,回收所有标记为白色(不可达)的对象所占用的内存空间。
标记-整理算法 的底层逻辑如下:
标记阶段:
- 与标记-清除算法相同。
整理阶段:
- 将所有黑色对象移动到内存空间的另一部分。
- 将所有白色对象标记为灰色。
- 将所有灰色对象移动到黑色对象的后面。
- 整理完成后,所有黑色对象都将位于内存空间的连续区域中,空闲空间将位于黑色对象的后面。
结合使用
标记-清除算法和标记-整理算法可以结合使用,以提高垃圾回收的效率。
- 标记-清除算法可以快速回收大部分不可达的对象。
- 标记-整理算法可以整理内存空间,减少内存碎片。
总结
- 标记-清除算法 + 标记-整理算法可以有效地回收内存空间。
- 标记-清除算法可以快速回收大部分不可达的对象。
- 标记-整理算法可以整理内存空间,减少内存碎片。
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 性能。
本文详细介绍了Java虚拟机中的几种常见垃圾回收器,包括SerialGC、ParallelGC、CMSGC、G1GC、EpsilonGC和ZGCGC,阐述了各自的算法、优缺点以及适用场景。根据应用需求选择合适的垃圾回收器是关键,如单核/多核环境、速度与延迟要求等。
649

被折叠的 条评论
为什么被折叠?



