2

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

运行

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

时间

4

1 回答 1

2

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

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

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

于 2013-03-09T00:56:16.800 回答