吞吐量垃圾回收

8
我正在学习Hotspot JVM垃圾回收,我有一个问题, 第一篇文章说:
吞吐量目标是以回收垃圾所花费的时间和应用程序时间(指垃圾回收之外的时间)为衡量标准。 第二篇文章则表示:
吞吐量是长时间内未在垃圾回收中花费的总时间的百分比。吞吐量包括分配时间(但通常不需要调整分配速度)。
此外,第二篇文章还提到:

吞吐量与可用内存量成反比。

我不确定吞吐量是否是衡量垃圾回收所花费的时间,或者与总可用内存量如何相关。

感谢您的帮助!

2个回答

4
我认为所引用的 Oracle 指南(“第二篇文章”)在这一段中存在错误,或者非常误导人(并且定义吞吐量为不同的内容,而没有明确说明)。您引用了 Java SE 6 HotSpot gc 调整指南,但是这个错误也存在于 Java 11 版本中: Java SE11,HotSpot 虚拟机垃圾回收调整指南,第4章,影响垃圾回收性能的因素
第4章,“影响垃圾回收性能的因素”:
总堆大小是影响垃圾回收性能最重要的因素。因为当代数填满时会发生垃圾回收,所以吞吐量与可用内存量成反比。
该指南的其余部分确实使用术语作为“应用程序/系统吞吐量”,而且“吞吐量”通常是三个 GC 调优目标之一,因此我认为这是一个错误。(我认为该指南的其余部分都很好)。
据我了解,这通常应该是相反的情况:
吞吐量通常与可用内存成正比。(不考虑特定调整效果,有时增加内存可能会导致吞吐量降低。)
我选择引用 Java Performance by Charlie Hunt and Binu John 中第7章“逐步调整JVM”第256-257页中关于吞吐量、内存和延迟之间定义和关系的权威论述。

吞吐量 吞吐量是单位时间内可以执行的工作量的度量。吞吐量要求忽略延迟或响应时间。通常,增加吞吐量会以增加延迟和/或增加内存占用为代价。

性能吞吐量要求的一个例子是“应用程序每秒执行2500个事务”。

延迟和响应时间 延迟或响应时间是指在应用程序接收到刺激并完成工作之间经过的时间。延迟或响应时间要求忽略吞吐量。通常,提高响应速度或降低延迟会以降低吞吐量和/或增加内存占用为代价。

延迟或响应时间要求的一个例子是“应用程序必须在60毫秒内完成交易请求”。

内存占用 内存占用是衡量在某个吞吐量、某个延迟或某个可用性和可管理性水平下运行应用程序所需的内存量的度量。内存占用通常表示为运行应用程序所需的Java堆大小或总内存量。通常,通过增加Java堆大小来增加内存占用可以改善吞吐量或降低延迟,或者两者兼备。当可用于应用程序的内存减少时,通常会牺牲吞吐量或延迟。


3

它与可用内存的总量有什么关系 ==> 在大多数情况下(非IO受限系统),随着任何进程可用的内存增加,其性能和吞吐量也会增加。在JVM的情况下,随着堆大小的增加,GC将要做的工作很少。因此,吞吐量与内存成反比例关系(并非总是如此,请记住这一点)。

接下来,吞吐量是非GC线程完成任务所需的总时间。


3
再次强调并确认我的理解,吞吐量是应用程序线程(非GC线程)可无阻塞执行任务的时间!因此增加堆大小可以增加这个时间,那么它如何与堆的反比有关呢? - chebus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接