JMH中hs_gc探查器计数器的含义

时间:2014-05-29 16:55:31

标签: java garbage-collection jmh

我正在使用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}

1 个答案:

答案 0 :(得分:11)

Serviceability in HotSpot: HotSpot Jvmstat Performance Counters对此有以下警告:

  

计数器具有结构名称,例如sun.gc.generation.1.namejava.threads.livejava.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 source code, jdk7u60 branch),特别是其资源文件: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特定的实现中定义(在GC特定文件夹中查找somethingCounters.cpp个文件与共享文件夹位于同一级别)但我无法找到他们可读的描述。

我无法找到定义带sun.gc.tlab前缀的计数器的位置。签出完整的JDK源代码并为相关的计数器名称搜索它应该可以帮助那些倾向于找到所有内容的人。