GC日志查看

可以通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略

GC的日志是以替换的方式(>)写入的,而不是追加(>>),如果下次写入到同一个文件中的话,以前的GC内容会被清空

对应的参数列表

1
2
3
4
5
6
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

指标

监控GC在于判断JVM是否在良好高效地工作并且是否需要投入性能调优(主要包括应用程序优化与JVM参数优化),关注的数据大概有:

  1. Mirror GC频率、持续时间以及回收内存量。
  2. Major GC频率、持续时间、回收内存量以及 stop-the-world 耗时。
  3. Heap 对象分配(导出.hprof文件分析,通常比较大)

GC LOG 及Collector行为分析

LOG分析包含前面文章所介绍的各个GC collector的行为分析。

  1. 通过加入 -XX:+PrintGCDetails参数则可以打印详细GC信息至控制台。
  2. 参数-verbose:gc也是可以,但不够详细。
  3. 通过加入-XX:+PrintGCDateStamps则可以记录GC发生的详细时间。
  4. 通过加入 -Xloggc:/home/XX/gc/app_gc.log 可以把GC输出至文件,这对长时间服务器GC监控很有帮助。

以下列出一些参数大致打印的信息如下:

  1. -verbose:gc:

    1
    [GC 72104K->9650K(317952K), 0.0130635 secs]
  2. -XX:+PrintGCDetails:

    1
    [GC [PSYoungGen: 142826K->10751K(274944K)] 162800K->54759K(450048K), 0.0609952 secs] [Times: user=0.13 sys=0.02, real=0.06 secs]
  3. -XX:+PrintGCDetails 加上-XX:+PrintGCDateStamps 参数则打印如下:

    1
    2015-12-06T12:32:02.890+0800: [GC [PSYoungGen: 142833K->10728K(142848K)] 166113K->59145K(317952K), 0.0792023 secs] [Times: user=0.22 sys=0.00, real=0.08 secs]

首先来说明一段在各个GC中通用的字段含义说明

  1. 142826K->10751K(274944K) 分别代表回收前、回收后以及总内存大小。
  2. Times: user=0.46 sys=0.05, real=0.07 secs:
    1. user代表GC 需要的各个CPU总时间(各个CPU时间相加)
    2. sys代表回收器自身的行为所占用CPU时间
    3. real则代表本次GC所耗费的真正耗时(在多核CPU中并行回收,它通常小于user)

GC监控工具

  • JConsole
  • JVisualVM

jmap

1
2
3
jmap -heap [pid] //整个JVM中内存的情况
jmap -histo [pid] //JVM堆中对象的详细占用情况
jmap -dump:format=b,file=[文件名] 7880

其中 7880为 PID,导出的文件可使用Memory Analyzer, jvisualvm, jprofile等工具打开

在使用CMS GC时,jmap -heap执行可能导致Java进程被挂起

jhat

如果你导出的 hprof 文件很大不方便下载本地分析,可以使用 jhat 启动HTTP Server的后可以使用浏览器访问

例如:执行 jhat d:/test.hprof / jhat -J -Xmx1024M [file] 端口提供HTTP服务,使用浏览器即可访问:

注:如果导出的文件很大,则需要开启更多的内存空间,使用  -J-Xmx5g 命令则开启最大5G

jstat (jstatd) & jvisualvm

jstat用于实时监测 GC情况,如PID为7880的应用监测,每 1000毫秒打印一次:

用于GC分析的参数

  • gc
  • gccapacity
  • gccause
  • gcnew
  • gcnewcapacity
  • gcold
  • gcoldcapacity
  • gcpermcapacity
  • gcutil
    • 可通过此命令查看jvm各代空间占用情况,minor gc次数,消耗时间、full gc次数及消耗时间统计
    • jstat -gcutil [pid] [interval] //每个多少秒打印一次
      参数 含义
      s0 Survivor空间的使用率
      s1 Survivor空间的使用率
      E Eden空间的使用率
      O old空间使用率
      P 持久代空间使用率
      YGC minor GC执行次数
      YGCT minor GC执行消耗时间
      FGC full GC执行次数
      FGCT full GC执行消耗时间
      GCT Minor GC + Full GC消耗时间

使用命令:

1
jstat -gc 7880 1000