分析Sun Hotspots的GC日志,JVM 6。

14

我正试图分析我们应用程序(在 Tomcat 下运行,使用 Sun的Hotspots JVM 1.6 )的GC行为。

到目前为止,我已经指示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日志,然后就崩溃了。是否有更好或更更新的工具来解析这些特定的日志,针对我正在使用的特定JVM?

7个回答

6

gcviewer已经好多年没有更新了,所以它的使用效果参差不齐 - 有些gc文件可以正常工作,而其他文件会出现异常。

IBM的gc日志解析器可以很好地工作,http://www.alphaworks.ibm.com/tech/pmat/faq

Sun有一个叫做GCPortal的东西,但需要:

  • 安装到Web应用服务器中
  • 安装awk和perl
  • 安装带有JDBC驱动程序和配置的RDBMS
  • 还有一个真正的杀手,第三方图形/图表软件曾经是免费的,现在不再是了。令人惊讶。

gchisto已经消失了,该项目中已经没有任何内容。

HPJmeter不理解IBM的gc文件。


3
gcviewer 用于 jdk 1.6/1.7 的版本正在以下网站进行更新:https://github.com/chewiebug/GCViewer。 - siddagrl

3

我个人使用 HP JMeter 进行很多垃圾回收可视化工作。它在 SUN JRE 上的效果还可以,但在 HP 的 JRE 上表现非常出色(不知道为什么)。

在非 HP 平台上使用 Sun HotSpot 1.6 时,我使用以下 GC 选项生成日志以进行分析:

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

我记得曾经使用过它,但现在 HPJmeter 似乎与 Oracle JRE gc.log 不兼容。 - Mohan Narayanaswamy
我在使用我上面列出的选项时,在任何版本的Oracle最新JVM(至少到1.7)上使用HP-JMeter都没有遇到问题。 - Helter Scelter

3

2

我看到过它,但它只能告诉我JVM现在的表现(或者过去一些有限的时间)。我想知道10、20、100小时前发生了什么。 - ripper234

0

这是一个$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];
    }
  }
}

0

我尝试使用Visual GC,但它似乎只能与一个ID进程(JVM或jstatd)一起工作。我无法使用它来处理jstat.gc文件,而不是流式数据。这样做是否正确?


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接