【从零开始学习JVM | 第九篇】了解 常见垃圾回收器

发布时间:2023年12月17日

前言:

垃圾回收器(Garbage Collector)是现代编程语言中的一项重要技术,它提供了自动内存管理的机制,极大地简化了开发人员对内存分配和释放的繁琐工作。通过垃圾回收器,我们能够更高效地利用计算机的内存资源,减少内存泄漏和程序崩溃的风险。

随着软件应用程序的复杂性不断增加,内存管理成为了开发过程中的一个关键挑战。手动管理内存往往容易出现错误,例如忘记释放已经不再使用的内存或者释放尚未被使用的内存,这将导致内存泄漏或者无效的内存访问。垃圾回收器通过监测和回收不再使用的内存,帮助我们解决了这些问题,使得我们能够更专注于程序的逻辑实现,而不必过多关注内存管理细节。

目录

前言:

垃圾回收器:

新生代垃圾回收器:

Serial(串行)垃圾回收器:

ParNew(并行新生代)垃圾回收器:

Parallel Scavenge(并行回收)垃圾回收器:

老年代垃圾回收器:

Serial Old(串行老年代)垃圾回收器:

CMS(Concurrent Mark-Sweep)垃圾回收器:

G1(Garbage-First)垃圾回收器:

总结:


?

垃圾回收器:

新生代垃圾回收器:

Serial(串行)垃圾回收器

回收年代和算法:

Serial垃圾回收器属于新生代的垃圾回收器,在新生代使用复制算法进行垃圾回收。在新生代中,对象主要分为Eden区、Survivor区From和Survivor区To。Serial垃圾回收器会将Eden区和From Survivor区中存活的对象复制到To Survivor区,同时清空Eden区和From Survivor区。在多次复制后仍存活的对象会被晋升到老年代,而老年代的垃圾回收则使用标记-整理算法。

优点:

  1. 简单高效:Serial垃圾回收器采用单线程执行垃圾回收操作,实现简单且高效。
  2. 资源消耗低:由于是单线程执行,因此对系统资源的占用较少,在某些资源受限的环境下表现良好。
  3. 适用于单核CPU:在单核CPU上,Serial垃圾回收器可以充分发挥其优势。

缺点:

  1. 停顿时间长:由于是单线程执行,垃圾回收过程可能会导致较长的停顿时间,影响应用程序的响应性能。
  2. 不适用于多核CPU:在多核CPU上,由于无法充分利用多核处理器的优势,性能表现不如并行或并发的垃圾回收器。

适用场景:

  1. 客户端应用:适用于客户端应用,例如桌面应用、移动应用等,对系统资源要求不高,能够提供稳定的垃圾回收性能。
  2. 小型服务器:适用于小规模的服务器应用,对系统资源要求不高,能够提供稳定的垃圾回收性能。

总之,Serial垃圾回收器适用于对系统资源要求不高、对停顿时间要求不敏感的场景,但不适合大型应用程序或高并发场景。

ParNew(并行新生代)垃圾回收器

回收年代和算法:

ParNew(并行新生代)垃圾回收器同样属于新生代的垃圾回收器,在新生代使用复制算法进行垃圾回收。它是Serial垃圾回收器的多线程版本,主要用于多核CPU环境下。ParNew垃圾回收器仍然将新生代分为Eden区和Survivor区,采用多线程并行方式进行垃圾回收操作,提高了回收效率。

优点:

  1. 多线程执行:ParNew垃圾回收器采用多线程并行方式进行垃圾回收操作,能够充分利用多核CPU的优势,提高垃圾回收效率。
  2. 低停顿时间:相比于Serial垃圾回收器,ParNew在执行垃圾回收操作时能够显著降低停顿时间,减少对应用程序的影响。

缺点:

  1. 资源消耗较大:由于采用多线程并行执行,可能会占用较多的系统资源。
  2. 不适用于单核CPU:在单核CPU上,ParNew垃圾回收器无法发挥其多线程并行的优势,性能表现可能不如Serial垃圾回收器。

适用场景:

  1. 中小型服务器:适用于中小规模的服务器应用,对系统资源要求不是很严格,但需要更好的垃圾回收性能。
  2. 对停顿时间要求较高的应用:对于需要较低停顿时间的应用,ParNew垃圾回收器能够提供更好的性能表现。

总之,ParNew垃圾回收器适用于对系统资源要求不是很严格,但对垃圾回收性能有一定要求的场景,特别是在多核CPU环境下能够充分发挥其优势。

Parallel Scavenge(并行回收)垃圾回收器

回收年代和算法:

Parallel Scavenge(并行回收)垃圾回收器是一种主要用于新生代的垃圾回收器,使用复制算法进行垃圾回收。与ParNew不同的是,Parallel Scavenge注重吞吐量优化,通过并行执行垃圾回收操作来提高整体应用程序的吞吐量。

优点:

  1. 高吞吐量:Parallel Scavenge垃圾回收器注重吞吐量优化,通过并行执行垃圾回收操作,能够提高整体应用程序的吞吐量。
  2. 减少停顿时间:尽管并行执行垃圾回收操作,Parallel Scavenge仍然能够在可控范围内减少停顿时间,使得应用程序响应更加迅速。

缺点:

  1. 资源消耗较大:由于并行执行垃圾回收操作,Parallel Scavenge可能会占用较多的系统资源,对系统的负载有一定影响。
  2. 不适用于低延迟场景:由于注重吞吐量优化,Parallel Scavenge垃圾回收器的设计目标并不是最低延迟,对于低延迟场景的需求可能表现不佳。

适用场景:

  1. 数据处理应用:适用于需要高吞吐量、对延迟要求相对较宽松的数据处理应用,如批处理任务、数据分析等。
  2. 服务器应用:适用于大型服务器应用,能够提供高并发处理和良好的吞吐量,对停顿时间要求不是非常严格的场景。

总之,Parallel Scavenge垃圾回收器适用于对吞吐量要求较高、对延迟要求相对宽松的场景。它通过并行执行垃圾回收操作来提高整体应用程序的吞吐量,尽管会占用一定的系统资源,但在合适的应用场景下能够发挥较好的性能表现。

老年代垃圾回收器:

Serial Old(串行老年代)垃圾回收器

回收年代和算法:

Serial Old(串行老年代)垃圾回收器是一种用于老年代的垃圾回收器,采用标记-整理算法进行垃圾回收。它是串行垃圾回收器的老年代版本,主要用于单线程环境下。

优点:

  1. 简单高效:Serial Old垃圾回收器采用串行方式执行垃圾回收操作,相比并行和并发垃圾回收器,它的实现较为简单,消耗的系统资源较少。
  2. 低停顿时间:由于是单线程执行,Serial Old垃圾回收器能够在垃圾回收过程中暂停应用程序的时间较短,对应用程序的影响较小。

缺点:

  1. 性能限制:由于采用串行方式执行垃圾回收操作,Serial Old垃圾回收器无法充分利用多核CPU的优势,性能表现可能不如并行和并发垃圾回收器。
  2. 不适用于大型应用:对于大型应用和高并发场景,Serial Old垃圾回收器可能无法满足性能要求,因为它是单线程执行的,处理能力有限。

适用场景:

  1. 低资源消耗的场景:适用于对系统资源要求较低的场景,如小型应用、移动设备等。
  2. 单线程环境:适用于单线程环境下的应用程序,由于只有一个线程执行垃圾回收操作,不会导致多线程竞争和资源占用。

总之,Serial Old垃圾回收器适用于对系统资源要求较低,且在单线程环境下的应用程序。它的简单高效以及低停顿时间的特点使得它适合于一些小型应用和低并发场景。但对于大型应用和高并发场景,可能需要考虑使用更为高级的并行或并发垃圾回收器来提高性能。

CMS(Concurrent Mark-Sweep)垃圾回收器

回收年代和算法:

CMS(Concurrent Mark-Sweep)垃圾回收器是一种用于老年代的并发标记-清除算法垃圾回收器。它的主要目标是减少应用程序的停顿时间,通过并发执行部分垃圾回收操作来实现。

优点:

  1. 低停顿时间:CMS垃圾回收器采用并发执行的方式,在垃圾回收过程中会与应用程序的执行同时进行,尽量减少对应用程序的停顿时间。
  2. 短暂的回收阶段:CMS垃圾回收器的标记和清除阶段尽可能地短暂,以减少对应用程序的影响。
  3. 高并发性:由于并发执行,CMS垃圾回收器能够充分利用多核CPU的优势,提供较高的吞吐量。

缺点:

  1. 需要更多的系统资源:由于并发执行垃圾回收操作,CMS垃圾回收器需要额外的系统资源支持,并且在回收过程中会产生一定的内存碎片。
  2. CPU资源抢占:由于并发执行,CMS垃圾回收器会占用一部分CPU资源,可能会对应用程序的执行性能产生一定影响。
  3. 存在退化问题:如果老年代内存不足无法分配对象,CMS就会退化成为Serial Old单线程回收老年代。

适用场景:

  1. 对低停顿时间要求较高的应用:CMS垃圾回收器适用于对低停顿时间有较高要求的应用程序,如实时性要求较高的系统、Web服务器等。
  2. 多核CPU环境:由于能够充分利用多核CPU的并发性能,CMS垃圾回收器适用于运行在多核环境下的应用程序。

总之,CMS垃圾回收器适用于对停顿时间要求较低的应用程序,并且能够在多核CPU环境下提供较高的吞吐量。它通过并发执行部分垃圾回收操作来减少停顿时间,但也需要更多的系统资源支持。在选择垃圾回收器时,应根据具体应用场景和性能需求进行评估和选择。

G1(Garbage-First)垃圾回收器

回收年代和算法:

G1(Garbage-First)垃圾回收器是一种面向堆内存整体管理的并发标记-整理算法垃圾回收器。它将堆内存划分为多个大小相等的区域(Region),并采用不同的算法对每个区域进行垃圾回收,从JDK9之后的默认垃圾回收器就是G1。

Paraller Scavenge 关注吞吐量,CMS关注暂停时间。

而G1把这两个垃圾回收器的优点进行了融合。?

优点:

  1. 低停顿时间:G1垃圾回收器采用并发执行的方式,在垃圾回收过程中会与应用程序的执行同时进行,尽量减少对应用程序的停顿时间。
  2. 高效的内存整理:由于采用标记-整理算法,G1垃圾回收器能够高效地进行内存整理,减少内存碎片,提高内存利用率。
  3. 精确控制回收时间:G1垃圾回收器能够根据实际情况动态调整回收时间和区域大小,以更精确地控制垃圾回收过程,减少对应用程序的影响。
  4. 允许多CPU并行垃圾执行:G1垃圾回收器允许多CPU并行垃圾回收,大大提高了垃圾回收效率。

缺点:

  1. 需要更多的系统资源:由于需要维护区域的信息和状态,G1垃圾回收器需要额外的系统资源支持,并且在回收过程中会产生一定的内存碎片。
  2. 较慢的回收速度:由于需要维护区域的信息和状态,G1垃圾回收器的回收速度可能相对较慢。

适用场景:

  1. 高吞吐量、低停顿时间要求的应用:G1垃圾回收器适用于对高吞吐量、低停顿时间有较高要求的应用程序,如在线交易系统、金融交易系统等。
  2. 大型应用程序:由于能够精确控制回收时间和区域大小,G1垃圾回收器适用于大型应用程序。

总之,G1垃圾回收器适用于对吞吐量和低停顿时间有较高要求的应用程序,并且能够精确控制回收时间和区域大小。它通过将堆内存划分为多个区域,采用不同的算法对每个区域进行垃圾回收,以提高垃圾回收效率和内存利用率。在选择垃圾回收器时,应根据具体应用场景和性能需求进行评估和选择。

由于垃圾回收器分为年轻代和老年代,因此除了G1之外的其他垃圾回收器必须组合使用。

?需要注意的是,G1将堆划分为了多个大小相等的区域,称为是区Region,区域不要求是连续的。

而Region Size 必须是2 的指数幂,范围从1M到32M。?

总结:

本文介绍了几种常见的垃圾回收器以及它们的工作原理。我们探讨了串行、并行、CMS和G1垃圾回收器,并指出了它们各自的优缺点和适用场景。同时,我们也强调了选择垃圾回收器组合的重要性,需要根据应用程序的特性、硬件环境和性能需求等因素进行灵活选择,以提供最优的性能和用户体验。通过合理的选择和优化,我们能够为应用程序提供更好的内存管理和垃圾回收性能。

如果我的内容对你有帮助,请点赞,评论,收藏创作不易,大家的支持就是我坚持下去的动力!

?

?

?

文章来源:https://blog.csdn.net/fckbb/article/details/134984992
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。