我正在尝试分析我们的应用程序的GC行为(在 Tomcat 中运行, Sun的热点, JVM 1.6 )。
到目前为止,我已经指示JVM使用...
将GC日志发送到单独的文件-Xloggc:gc.log
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGC
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
...并使用jstat使用...输出日志
jstat -gc -t 29045 5s > jstat.gc
我看到了有趣的信息,但还没有找到一个工具来帮助我分析/可视化这些日志。我被this question指向GCViewer,但它只从gc.log中解析几条日志行,然后崩溃并出现异常。对于我正在使用的特定JVM,是否有更好或更新的解析这些特定日志的工具?
答案 0 :(得分:6)
gcviewer
多年来一直没有更新,所以它被击中或错过 - 一些gc文件可以正常工作,其他gc文件也会有例外。
IBM的gc日志解析器可以接受, http://www.alphaworks.ibm.com/tech/pmat/faq
Sun有一种名为GCPortal的东西,但需要:
gchisto
已经死了,项目中已经没有任何东西了。
HPJmeter不了解IBM gc文件。
答案 1 :(得分:3)
我个人使用HP JMeter进行大量GC可视化。它在SUN JRE上运行“ok”,在HP的JRE上非常好(如图)。
使用Sun HotSpot 1.6(在非HP平台上),我使用这些GC选项生成用于分析的日志:
-Xloggc:/path/to/vgc/log/location/logfile.vgc --XX:+PrintHeapAtGC
答案 2 :(得分:3)
IBM Support Assistant中提供的工具做得非常好。
答案 3 :(得分:2)
答案 4 :(得分:0)
我尝试使用Visual GC,但似乎使用了id进程(jvm one ou jstatd one)。我不能将它与jstat.gc一起使用,我指的是文件而不是流 是不是?
答案 5 :(得分:0)
尝试使用gchisto(gchisto.dev.java.net)。它可以理解GC日志输出(我不确定它是否已更新以与G1 GC一起使用)。您必须从CVS获取源代码(您需要一个dev.java.net帐户)并自己构建
答案 6 :(得分:0)
以下是适用于1.5 CMS收集器的0.00美元日志刮刀,可让您高度了解GC暂停情况。
您可能需要将位置参数$ 7参数更改为时间戳函数,以匹配您的日志行语法(我的.out由Tanuki Wrapper“增强”)。
#! /usr/bin/awk -f
# Awk script to parse .out logs and print total of
# stop-the-world GC pause times in ten minute intervals
BEGIN {print "t\timark\tmark\tremark\tfullgc"}
/CMS-initial-mark:/ {
t=timestamp($7);
imark[t] += $(NF-1);
}
/\[CMS-concurrent-mark:/ {
t=timestamp($7);
split($(NF-1), b, "/");
# print t" NF="NF" val="b[1];
mark[t] += b[1];
}
/CMS-remark/ {
t=timestamp($7);
remark[t] += $(NF-1);
}
/\[Full GC / {
t=timestamp($7);
level=0;
for (i=1; i<=NF; i++) {
if ($i ~ /\[/) {
level++;
} else if ($i ~ /\]/) {
level--;
}
}
while (level > 0) {
getline;
for (i=1; i<=NF; i++) {
if ($i ~ /\[/) {
level++;
} else if ( $i ~ /\]/ ) {
level-- ;
}
}
}
if ( $(NF) ~ /secs\]/ ) {
full[t] += $(NF-1) ;
}
}
function timestamp(str) {
split(str, a, ":");
return a[1]":"substr(a[2],0,length(a[2])-1)"0";
}
# print out UK+US trading hours
END {
for (hour = 5; hour <= 16; hour++) {
for (minute = 0; minute <= 59; minute+=10) {
t = sprintf("%02d:%02d", hour, minute);
printf "%s\t%d\t%d\t%d\t%d\n", t, imark[t], mark[t], remark[t], full[t];
}
}
}