JVM中的垃圾回收器是怎么选择的?

JVM中的垃圾回收器的选择主要依据两个原则:

  1. 吞吐量优先还是低延迟优先:吞吐量优先则选择回收速度快的回收器,低延迟优先则选择产生较短停顿的回收器。
  2. 不同垃圾回收器的特点:不同的垃圾回收器有不同的特点,如并发与非并发、压缩与非压缩等,需要根据实际场景选择最合适的回收器。
    根据以上两个原则,HotSpot VM提供了多种垃圾回收器组合进行选择:
  • Serial + Serial Old:默认配置,Serial用于新生代,Serial Old用于老生代,简单高效,但会产生较长停顿时间。
  • ParNew + SerialOld:ParNew是Serial的并行版本,可以减少新生代回收的停顿时间。
  • Parallel Scavenge + SerialOld:吞吐量优先的配置,Parallel Scavenge是并行的新生代回收器,能最大限度提高新生代回收的吞吐量。
  • CMS + Serial Old:低延迟优先的配置,CMS是并发的老生代回收器,能最小化停顿时间。
  • G1:G1垃圾回收器既可以在用户指定的停顿时间内完成回收,也可以在指定吞吐量的前提下完成回收,适用于大容量内存与更高的吞吐量或低延迟要求的场景。

除此之外,还有ZGC、Shenandoah等实验性垃圾回收器。

对开发工程师来说,理解JVM的这套垃圾回收器的选择机制很重要。在不同的应用场景下选择合适的垃圾回收器组合,可以最大限度满足程序的性能要求,达到吞吐量与低延迟的平衡。

这也需要我们对不同垃圾回收器有比较全面的了解,明白其特点与应用场景。只有理论与实践结合,不断总结经验,我们才能游刃有余地进行这些选择,设计出高性能的程序。