【问题标题】:Optimizing GC running time优化 GC 运行时间
【发布时间】:2013-03-09 08:56:16
【问题描述】:

我正在比较我们一个项目的两个分支的性能,一个比另一个慢得多。我注意到一个的 GC 运行计数更高(见下图)。

更有趣的是,运行时间要高出许多倍,远远超过额外运行所能解释的。什么可以解释运行次数增加 40%(ish),运行时间增加了 6 倍?更大的物体?对象太多?还有哪些旋钮可以在这里调整,有什么效果? (一些好的链接可以作为答案)

【问题讨论】:

  • 这是一个很复杂的事情,要在论坛里回答。在任何情况下,您都可以首先检查您是否创建了比以前更多的对象,其中有多少在第一代中死亡,有多少正在过渡到下一个,并尝试弄清楚您是否可以创建更少的对象。
  • 没有一个灵丹妙药来回答这个问题。如果您正在寻找有关调整垃圾收集的信息:oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
  • 这些是小收藏还是全收藏?如果您尝试增加新尺寸,您会看到什么?
  • 由于重构,出现了更多的字符串对象。我现在将使用 StringBuilder 来减轻一些负担。

标签: java optimization garbage-collection


【解决方案1】:

以下是一些基本指南,可帮助您分析应用程序的两个分支/版本的性能和 GC 行为:

  1. 评估两个应用程序的 GC 行为
    • 收集 GC 日志并计算 Live Data Set 大小、Allocation RatePromotion RateTotal GC时间。这应该可以让您凭经验比较两个应用的 GC 行为。
    • 您应该比较应用之间的这些 GC 统计信息,您是否看到两个应用之间的任何峰值/差异。
    • 请参阅此处了解如何收集这些数据:Is there a cookbook guide for GC problems?
  2. 收集直方图
    • 如果您在步骤 1 中确认确实存在主要的 GC 差异,请尝试收集 Class Histograms 以查看哪些类占用了堆。 比较两个应用之间的直方图,看看在类类型、实例数量方面是否有任何差异。这应该可以帮助您找出罪魁祸首。
    • 在 FullGC 之前/之后收集直方图:-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC
    • 此外,您可以在运行期间随时收集快照jmap -histo $pid。特别是当您看到可疑的响应时间/CPU 峰值等时。
  3. 使用 Java 分析工具分析内存
    • 收集两个应用程序的配置文件并进行比较,
    • 我会推荐 jProfiler

性能比较的基本准则:为了有效地比较性能,您需要能够为两个版本的应用程序生成相同的工作负载,并在运行前进行一些预热时间,然后稳定地收集数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多