优化GC运行时间

时间:2012-06-13 14:36:40

标签: java optimization garbage-collection

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

Runs

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

Time

1 个答案:

答案 0 :(得分:2)

以下是一些基本指南,说明如何分析应用程序的两个分支/版本的性能和GC行为:

  1. 评估两个应用程序的GC行为
    • 收集GC日志并计算实时数据集大小,分配率促销率总GC 时间。这应该允许您凭经验比较两个应用程序的GC行为。
    • 您应该比较应用之间的这些GC统计信息,您是否看到两个应用之间存在任何尖峰/差异。
    • 请点击此处了解如何收集这些数据:Is there a cookbook guide for GC problems?
  2. 收集直方图
    • 如果您在步骤1中确认确实存在主要的GC差异,请尝试收集类直方图以查看哪些类占用堆。 比较两个应用之间的直方图,看看类类型,实例数是否有任何差异。这应该可以帮助你找出罪魁祸首。
    • 收集FullGC之前/之后的直方图:-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC
    • 并且,您还可以在运行期间随时收集快照jmap -histo $pid。特别是如果你看到可疑的ResponseTimes / CPU峰值等
  3. 配置文件使用Java分析工具创建内存
    • 收集两个应用程序的配置文件并进行比较,
    • 我会推荐 jProfiler
  4. 性能比较的基本准则:要有效地比较性能,您需要能够为应用程序的两个版本生成相同的工作负载,并运行一些预热时间然后在稳定的阶段收集数据。