【问题标题】:How to interpret GC Activity graph in JProfiler?如何解释 JProfiler 中的 GC 活动图?
【发布时间】:2017-09-28 11:14:33
【问题描述】:

最近我一直致力于优化一些代码(计算时间和所需的最大内存)。要了解优化内存成本是否有潜在收益,我使用 JProfiler。 通常

  • 如果它很高,我应该尝试在全球范围内减少它
  • 如果它很尖,我应该尽量减少中间对象的创建

现在,我处于第二种情况,GC 活动图显示峰值,但均小于 2%(见下图)。我该如何理解?

默认情况下,我的理解是 GC Activity 曲线的总和/积分是对用于收集数据的 cpu 总百分比的估计。所以在这里,这意味着远低于最大 2%

对吗?我错过了什么吗?

【问题讨论】:

  • 您可以添加图片吗?此外,如果您想要更详细的 GC 解释 GC 活动,您应该启用 gc 日志记录并通过 gcviewer 运行。
  • 我添加了一张图片。我不知道 gc 日志记录功能,它有什么作用?
  • gc 日志提供了关于整体 GC 性能的更详细的统计信息。 jprofiler 更适合分析对象图和分配站点。因此,如果您想更好地了解聚合行为,那么解释 gc 日志将提供更多洞察力。如果你想知道什么被分配到哪里,那么探查器是更好的选择。

标签: garbage-collection jprofiler


【解决方案1】:

默认情况下,我的理解是 GC 的 sum/integrale 活动曲线是对使用的 CPU 总百分比的估计 收集数据。所以在这里,这意味着远低于最大 2%

对吗?

是的,没错。如果你想知道临时对象被分配到哪里,去Live Memory->Allocation Call Tree,选择“Garbage collect objects”作为liveness mode

要查看任何分配点或分配热点中的分类,请使用“显示类”调用树分析。

【讨论】:

    【解决方案2】:

    默认情况下,我的理解是 GC Activity 曲线的总和/积分是对用于收集数据的 cpu 总百分比的估计。

    应该是的,是的。

    所以这意味着远低于最大 2%

    max 在这里具有欺骗性。如果您使采样间隔足够小,则最大值将是 GCing 所花费时间片的 100%。那是该切片小于 GC 暂停持续时间的时候。所以这些峰值已经是一些更大时间段的平均值。

    我该如何理解?

    您的应用程序可能没有在 GC 上花费太多时间。但是您的图表仅涵盖相对较少的时间,因此它可能无法反映主要收集或并发周期。如果您关心延迟而不仅仅是吞吐量,解释 JVM 的 GC 日志将提供更多详细信息。

    【讨论】:

    • 感谢您的回答。在这里,我正在优化一段分析代码,一个核心上的纯计算。 (分布式)应用程序调用了 1000 次相同的代码。我想我会在优化应用程序时查看 gc 日志记录。请注意,奇怪的是有 2 种行为(第 1 次与第 2 次半),而该图涵盖了对相同代码的 8 次迭代调用,只有一些不同的输入随机值应该只改变结果值,而不是计算结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2017-06-25
    相关资源
    最近更新 更多