我正在使用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}
答案 0 :(得分:11)
Serviceability in HotSpot: HotSpot Jvmstat Performance Counters对此有以下警告:
计数器具有结构名称,例如
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 docs,jstat 8 windows docs,jstat 7 docs)。它为许多性能计数器提供了人类可读的简短描述,例如:
FGC: Number of full GC events.
第二个信息来源是jstat
源代码(jstat source code, jdk7u60 branch),特别是其资源文件:jstat_options和jstat_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.collector
和sun.gc.generation
的内部计数器名称映射到人类可读的描述或至少获取来自jstat_options
文件中的评论的一些其他信息。
大多数具有sun.gc.policy
前缀的计数器在gcPolicyCounters.cpp和gcAdaptivePolicyCounters.cpp以及GC特定的实现中定义(在GC特定文件夹中查找somethingCounters.cpp
个文件与共享文件夹位于同一级别)但我无法找到他们可读的描述。
我无法找到定义带sun.gc.tlab
前缀的计数器的位置。签出完整的JDK源代码并为相关的计数器名称搜索它应该可以帮助那些倾向于找到所有内容的人。