我正在通过Hotspot JVM垃圾收集,我有一个问题,
First文章说
吞吐量目标以的时间来衡量 收集垃圾和垃圾收集之外的时间 (简称申请时间)。
Second有人说,
吞吐量是未花费在垃圾上的总时间的百分比 收集,长期考虑。吞吐量 包括分配时间(但调整分配速度) 通常不需要)。
Second文章也说
吞吐量与内存量成反比 可用。
我很困惑吞吐量是否是垃圾收集所花费的时间或不用于垃圾收集的时间量,以及它与可用内存总量的关系。
感谢您的帮助!
答案 0 :(得分:2)
它与可用内存总量的关系 ==>在大多数情况下(非IO绑定系统),随着任何进程可用的内存增加,它的性能和吞吐量都会增加。在JVM的情况下,随着堆大小的增加,GC几乎没有工作要做。因此,吞吐量与内存成反比(并非总是如此。请记住这一点。)
接下来,吞吐量是非GC线程执行任务的总时间。
答案 1 :(得分:0)
不幸的是,我认为所引用的Oracle指南(“第二篇文章”)在本段中有错误,或者是非常具有误导性的(在未明确说明的情况下,将吞吐量定义为不同的内容)。 您参考了Java SE 6 HotSpot gc调整指南,但是Java 11版本中也存在该错误: Java SE11,HotSpot Virtual Machine Garbage Collection Tuning Guide, chapter 4, Factors Affecting Garbage Collection Performance:
第4章,“影响垃圾收集性能的因素”:
总堆 影响垃圾收集性能的最重要因素是 总可用内存。因为收集发生在世代之间 填满后,吞吐量与内存量成反比 可用。
该指南的其余部分的确将其用作应用程序/系统吞吐量,并且吞吐量通常是三个GC调整目标之一,因此我认为这是一个错误。 (我认为指南的其余部分很好)。
据我所知,通常应该相反:
吞吐量通常与内存量成正比 可用。
(不考虑调整特定效果,在某些情况下可能会增加内存并获得更少的吞吐量。)
我选择引用Java Performance by Charlie Hunt and Binu John上的一个权威,我认为它提出了吞吐量,内存和 latency之间的定义和关系在第7章“逐步调试JVM”第256-257页中非常清楚:
吞吐量 吞吐量是可以执行的工作量的度量 每单位时间。吞吐量要求忽略延迟或 响应能力。通常,增加吞吐量是以牺牲以下成本为代价的 延迟增加和/或内存占用增加。
性能吞吐量要求的一个示例是“应用程序 应该每秒执行2500个事务。”
延迟和响应能力 延迟或响应度是衡量两次之间的经过时间的量度 当应用程序收到激励以执行某些工作并且该工作 完成了。延迟或响应性要求被忽略 吞吐量。通常情况下,响应速度加快或延迟降低 以降低吞吐量和/或增加内存为代价 足迹。
延迟或响应能力要求的一个示例是“ 申请应在60天内完成交易请求 毫秒。”
内存占用量 内存占用量是运行所需的内存量的量度 以某种吞吐量,某种程度的延迟, 和/或某种程度的可用性和可管理性。内存占用 通常表示为运行所需的Java堆数量 应用程序和/或运行程序所需的内存总量 应用。通常,通过增加内存占用量来增加 Java堆大小可以提高吞吐量或减少延迟,或两者兼有。 随着可供应用程序使用的内存减少, 通常会牺牲吞吐量或延迟。