【JVM系列】吞吐量优先的垃圾收集器——Parallel Scavenge和Parallel Old收集器

【JVM系列】吞吐量优先的垃圾收集器------Parallel Scavenge和Parallel Old收集器

欢迎关注,分享更多原创技术内容~

微信公众号:ByteRaccoon、知乎:一只大狸花啊、稀土掘金:浣熊say

微信公众号海量Java、数字孪生、工业互联网电子书免费送~

什么是GC中的吞吐量?

在垃圾回收(GC)中吞吐量(Throughput)是指在一定时间内成功完成的工作量或任务的数量,即用户线程运行时间占总时间的比例。一般而言,GC时间和STW的时间越短,用户线程的执行时间就会越长,占用总时间比例也会越高,吞吐量也越高。吞吐量可以通过以下公式计算:

auto 复制代码
吞吐量 = 用户线程执行时间/总时间 * 100%  = 用户线程执行时间/(GC时间+用户线程执行时间)* 100%

其中,"有效工作时间"表示垃圾回收系统真正用于执行用户线程任务的时间,而"总时间"表示"用户线程执行时间+垃圾回收时间"。

在Java中,通过选择合适的垃圾回收器、调整相关参数,以及优化代码,可以达到更好的吞吐量性能。例如,一些并行垃圾回收器(如Parallel GC)通过多线程并行执行垃圾回收操作,提高吞吐量。

同时,一些并发垃圾回收器(如CMS和G1)通过在应用程序运行的同时执行垃圾回收来减小停顿时间,也有助于提高吞吐量。

对于不同类型的垃圾回收器,需要根据实际的项目情况和垃圾回收器属性来选择适合的垃圾回收器。

选择高吞吐量还是低停顿?

一般而言,垃圾回收器的设计目标分为两大方向:低停顿时间和高吞吐量,不同的应用场景可能需要根据具体需求选择适当的垃圾回收策略。

低停顿时间的垃圾回收器通常意味着用户的线程的等待时间短,服务响应快速,适合实时性要求较高的服务,例如:Web服务,实时通讯系统等。

而高吞吐量的垃圾回收器一般意味着系统整体在GC上消耗的时间更短,整体吞吐量更高,适合对实时性要求不那么高的系统,例如:科学数据计算。

  1. **低停顿时间(Low Latency):**垃圾回收器追求低停顿时间主要是为了减小应用程序在垃圾回收过程中的停顿时间,从而提高系统的实时响应性。这对于需要快速响应用户请求、对实时性要求较高的服务非常重要。例如:

    • Web服务: 在Web服务中,用户期望快速加载页面和响应请求,因此低停顿时间的垃圾回收器更适合这种场景。
    • 实时通讯系统: 在实时通讯系统中,用户希望消息能够及时传递,低停顿时间有助于减小消息传递的延迟。
  2. **高吞吐量(High Throughput):**垃圾回收器追求高吞吐量主要是为了最大化整体系统的工作效率,提高在一定时间内完成的任务数量,适用于对实时性要求相对较低、更关注系统整体性能的场景。例如:

    • 科学数据计算: 在科学计算领域,对于大规模数据的处理,高吞吐量的垃圾回收器有助于系统更快地完成计算任务,提高科学计算的效率。
    • 批处理应用: 对于需要处理大量数据的批处理应用,高吞吐量可以加速数据处理的速度,提高整体系统的吞吐能力。

在Java中,一些垃圾回收器在设计上更倾向于低停顿时间,例如CMS(Concurrent Mark-Sweep)和G1(Garbage-First),而另一些则更倾向于高吞吐量,例如Parallel GC。选择合适的垃圾回收策略通常需要根据应用的性能需求、系统硬件配置和特定场景下的优劣势进行权衡和调整。

年轻代吞吐量优先收集器------Parallel Scavenge 收集器

Parallel Scavenge(并行年轻代垃圾回收器)是Java HotSpot虚拟机中的一种垃圾回收器,专注于对新生代进行并行垃圾回收。它的设计目标是在多核处理器上提供高吞吐量,以最大化整体系统的工作效率。以下是关于Parallel Scavenge垃圾回收器的一些重要特点和概念:

  1. 并行收集: Parallel Scavenge采用了多线程并行的方式进行新生代的垃圾回收。这意味着在垃圾回收过程中,多个线程同时工作,以加速垃圾回收的速度。
  2. 复制算法: Parallel Scavenge使用了复制算法(Copying Algorithm)来管理新生代。新生代被划分为两个相等的区域:Eden区和两个Survivor区(S0和S1)。在垃圾回收过程中,存活的对象被复制到其中一个Survivor区,而非存活的对象则被直接清理。
  3. 目标吞吐量: Parallel Scavenge的设计目标是通过并行执行来实现高吞吐量。它更注重整体系统的工作效率而不是单次垃圾回收的停顿时间,适用于对实时性要求相对较低的应用。
  4. 自适应调节: Parallel Scavenge具有自适应调节的功能,能够根据系统的负载情况动态调整垃圾回收策略,以提供更好的性能。例如,根据垃圾回收的停顿时间动态调整新生代的大小。
  5. 参数调优: 用户可以通过一系列的参数来调整Parallel Scavenge的行为,以满足特定应用场景的性能需求。例如,可以通过-XX:MaxGCPauseMillis参数设置期望的最大垃圾回收停顿时间。

启动参数示例:

bash 复制代码
java -XX:+UseParallelGC -XX:MaxGCPauseMillis=200 -Xmx512m -jar YourApplication.jar

在这个例子中,通过-XX:+UseParallelGC启用Parallel Scavenge垃圾回收器,并通过-XX:MaxGCPauseMillis设置期望的最大垃圾回收停顿时间为200毫秒。更多设置参数如下:

参数 描述
-XX:+UseParallelGC 启用 Parallel Scavenge 垃圾回收器。
-XX:MaxGCPauseMillis=<max-pause-time> 设置期望的最大垃圾回收暂停时间,单位是毫秒。
-XX:GCTimeRatio=<gc-time-ratio> 设置吞吐量目标的垃圾回收时间比率。
-XX:NewRatio=<new-ratio> 设置新生代与老年代堆大小的比例。默认值是2,表示新生代占整个堆的1/3。
-XX:SurvivorRatio=<survivor-ratio> 设置 Eden 区与 Survivor 区的大小比例。默认值是8,表示 Eden 占整个新生代的8/10。
-XX:MaxTenuringThreshold=<threshold> 设置对象晋升到老年代的最大年龄。默认值是15。

总体而言,Parallel Scavenge适用于那些对高吞吐量要求较高、对实时性要求相对较低的应用场景。

老年代吞吐量优先收集器------Parallel Old收集器

Parallel Old 是 Java HotSpot 虚拟机中的老年代垃圾回收器,它是 Parallel Scavenge 的老年代版本。与 Parallel Scavenge 一样,Parallel Old 也注重高吞吐量,旨在最大化整体系统的工作效率。以下是关于 Parallel Old 垃圾回收器的一些主要特点:

  1. 并行收集: Parallel OldParallel Scavenge 一样,采用多线程并行的方式进行垃圾回收。这意味着在老年代的垃圾回收过程中,多个线程同时参与,以提高吞吐量。
  2. 标记-整理算法: Parallel Old 使用标记-整理(Mark-Compact)算法来进行老年代的垃圾回收。在标记阶段,标记存活的对象,然后在整理阶段,将存活的对象整理到一端,以便为新对象的分配腾出空间。
  3. 目标吞吐量:Parallel Scavenge 一样,Parallel Old 的设计目标是追求高吞吐量。这意味着它更注重整体系统的工作效率,适用于对实时性要求相对较低的应用。
  4. 自适应调节: Parallel Old 同样具有自适应调节的功能,可以根据系统的负载情况动态调整垃圾回收策略,以提供更好的性能。
  5. 参数调优: 用户可以通过一系列的参数来调整 Parallel Old 的行为,以满足特定应用场景的性能需求。例如,可以通过 -XX:MaxGCPauseMillis 参数设置期望的最大垃圾回收停顿时间。

启动参数示例:

bash 复制代码
java -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=200 -Xmx1024m -jar YourApplication.jar

在这个例子中,通过 -XX:+UseParallelOldGC 启用 Parallel Old 垃圾回收器,并通过 -XX:MaxGCPauseMillis 设置期望的最大垃圾回收停顿时间为200毫秒。更多Parallel Old的设置参数如下:

参数 描述
-XX:+UseParallelOldGC 启用 Parallel Old 垃圾回收器。
-XX:MaxGCPauseMillis=<max-pause-time> 设置期望的最大垃圾回收暂停时间,单位是毫秒。
-XX:GCTimeRatio=<gc-time-ratio> 设置吞吐量目标的垃圾回收时间比率。
-XX:MaxTenuringThreshold=<threshold> 设置对象晋升到老年代的最大年龄。默认值是15。

总体而言,Parallel Old 适用于那些对高吞吐量要求较高、对实时性要求相对较低的应用场景,特别是在老年代的垃圾回收方面。

总结

Parallel Scavenge和Parallel Old收集器是专门为提Java程序吞吐量而设计的多线程版本的垃圾回收器,其基本原理也是采用多线程并行的垃圾回收策略。由于其高吞吐量的特点,更适用于计算量有限的后台服务而不适用于响应时间优先的场景。

其核心实现有专门为提高吞吐量而设计的代码,和ParNew垃圾回收器有所不同。由于目前JDK 21都出来了,PS和PO垃圾回收器实际上在生产厂运用得并不多,我们只需要了解它的一些基本概念和设置接口。

相关推荐
颜淡慕潇34 分钟前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
向前看-8 小时前
验证码机制
前端·后端
超爱吃士力架9 小时前
邀请逻辑
java·linux·后端
AskHarries11 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion12 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp13 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder13 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚14 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心15 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端