4

我将 JMH 基准测试工具与 hs_gc 热点分析器一起使用。

我遇到的问题是我不确定输出计数器值的含义,并且无法在网上找到参考。

谁能指出我的规范方向或解释这些值?

我在下面粘贴了一个示例输出:

HS(GC) | difference: {

sun.gc.collector.0.invocations=16,
sun.gc.collector.0.lastEntryTime=37106821,
sun.gc.collector.0.lastExitTime=37109336,
sun.gc.collector.0.time=1528884,

sun.gc.collector.1.invocations=6,
sun.gc.collector.1.lastEntryTime=34419368,
sun.gc.collector.1.lastExitTime=35532892,
sun.gc.collector.1.time=6721387,

sun.gc.generation.0.space.0.used=872712984,
sun.gc.generation.1.space.0.used=5721334504,
sun.gc.generation.2.space.0.used=4848,

sun.gc.policy.avgBaseFootprint=5312,

sun.gc.policy.avgMajorIntervalTime=-667,
sun.gc.policy.avgMajorPauseTime=-41,

sun.gc.policy.avgMinorIntervalTime=-557,
sun.gc.policy.avgMinorPauseTime=1,

sun.gc.policy.avgOldLive=88064,
sun.gc.policy.avgPromotedAvg=421184,
sun.gc.policy.avgPromotedDev=364832,
sun.gc.policy.avgPromotedPaddedAvg=1515648,
sun.gc.policy.avgSurvivedAvg=1056640,
sun.gc.policy.avgSurvivedDev=-189440,
sun.gc.policy.avgSurvivedPaddedAvg=488320,
sun.gc.policy.avgYoungLive=2708352,

sun.gc.policy.liveAtLastFullGc=5721334504,
sun.gc.policy.liveSpace=2801664,

sun.gc.policy.majorGcCost=5,
sun.gc.policy.majorPauseYoungSlope=-3,

sun.gc.policy.minorGcCost=2,
sun.gc.policy.minorPauseTime=3,
sun.gc.policy.minorPauseYoungSlope=1,

sun.gc.policy.mutatorCost=-7,

sun.gc.policy.oldEdenSize=11534336,
sun.gc.policy.promoted=4584928,
sun.gc.policy.survived=6194624,

sun.gc.tlab.alloc=12852845,
sun.gc.tlab.fills=-15,

sun.gc.tlab.gcWaste=-100979,
sun.gc.tlab.maxFills=-22,
sun.gc.tlab.maxGcWaste=-100859,
sun.gc.tlab.maxSlowAlloc=-5,
sun.gc.tlab.maxSlowWaste=8826,

sun.gc.tlab.slowAlloc=-5,
sun.gc.tlab.slowWaste=8849}
4

1 回答 1

12

HotSpot 中的可维护性:HotSpot Jvmstat 性能计数器对此有以下警告:

计数器具有结构化名称,例如sun.gc.generation.1.name, java.threads.live, java.cls.loadedClasses。这些计数器的名称和用于表示它们的数据结构被认为是 HotSpot JVM 的私有、未提交的接口。用户不应依赖任何计数器名称,尤其是那些以“java.”以外的前缀开头的计数器名称。

附加警告:下面的所有源代码链接都指向特定的hg.openjdk.java.net/jdk7u/jdk7u60分支和特定的文件修订。链接本身应该永远有效,但随着 JVM 的发展,新文件版本可能会使本文中的信息过时。

第一个信息来源是jstat文档(jstat 8 unix docsjstat 8 windows docsjstat 7 docs)。它为许多性能计数器提供了一个人类可读的简短描述,例如:

FGC: Number of full GC events.

第二个信息来源是jstat源代码(jstat 源代码,jdk7u60 分支),特别是它的资源文件:jstat_optionsjstat_unsupported_options。例如,在以下代码段FGC中搜索结果:jstat_options

column {
  header "^FGC^"    /* Full Collections */
  data sun.gc.collector.1.invocations
  align center
  width 5
  scale raw
  format "0"
}

使用jstat_options源代码和jstat文档,可以将大多数带有前缀的内部计数器名称映射sun.gc.collectorsun.gc.generation人类可读的描述,或者至少从jstat_options文件内的注释中获取一些附加信息。

大多数带sun.gc.policy前缀的计数器都在gcPolicyCounters.cppgcAdaptivePolicyCounters.cpp以及特定于 GC 的实现中定义(somethingCounters.cpp在与共享文件夹位于同一级别的特定于 GC 的文件夹中查找文件)但我找不到人- 他们的可读描述。

我无法找到sun.gc.tlab定义带有前缀的计数器的位置。检出完整的 JDK 源代码并用 grep 查找相关的计数器名称对于那些想要找到所有内容的人来说应该是有用的。

于 2014-06-03T09:18:02.607 回答