分析Sun Hotspots,JVM 6的GC日志

我正在尝试分析我们的应用程序的GC行为(在Tomcat中运行,在Sun的Hotspots下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 

我看到有趣的信息,但没有找到一个工具来帮助我分析/可视化这些日志。 我通过这个问题指向了GCViewer,但它只解析了gc.log中的几个日志行,然后崩溃并出现exception。 对于我正在使用的特定JVM,是否有更好或更新的工具来解析这些特定日志?

gcviewer已经好几年没有更新了,所以它很受欢迎 – 一些gc文件可以正常运行,其他gc文件可以正常运行。

IBM的gc日志解析器可以接受, http://www.alphaworks.ibm.com/tech/pmat/faq

Sun有一个名为GCPortal的东西,但它需要:

  • 安装到Web应用程序服务器中
  • 安装awk和perl
  • 使用JDBC驱动程序和配置安装RDBMS
  • 和真正的杀手,第三方图表/图表软件过去是免费的,现在不是。 惊人。

gchisto已经死了,项目中已经没有任何东西了。

HPJmeter不了解IBM gc文件。

IBM Support Assistant中提供的工具做得非常好。

我个人使用HP JMeter进行大量GC可视化。 它在SUN JRE上运行“ok”,在HP的JRE上运行得非常好(如图)。

使用Sun HotSpot 1.6(在非HP平台上),我使用这些GC选项生成用于分析的日志:

 -Xloggc:/path/to/vgc/log/location/logfile.vgc --XX:+PrintHeapAtGC 

你看过jvisualvm吗? 附带最新的JDK,并允许您观看JVM。 示例输出(使用visualGC插件)。 示例输出 – 替代文字http://sofzh.miximages.com/java/visualgc_2.png

我尝试使用Visual GC,但它似乎使用id进程(jvm one ou jstatd one)。 我不能用它与jstat.gc,我的意思是一个文件,而不是一个流是不是?

尝试使用gchisto(gchisto.dev.java.net)。 它可以理解GC日志输出(我不确定它是否已更新以使用G1 GC)。 您必须从CVS获取源代码(您需要一个dev.java.net帐户)并自行构建

这是一个价值$ 0.00的日志刮刀,适用于1.5 CMS收集器,可以让您高度了解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]; } } }