Fork of tagtraum industries' GCViewer. Tagtraum stopped development in 2008, I aim to improve support for Sun's / Oracle's java 1.6+ garbage collector logs (including G1 collector)
GCViewer is a little tool that visualizes verbose GC output
generated by Sun / Oracle, IBM, HP and BEA Java Virtual Machines. It
is free software released under GNU LGPL.
You can start GCViewer (gui) by simply double-clicking on gcviewer-1.3x.jar
or running java -jar gcviewer-1.3x.jar (it needs a java 1.8 vm to run).
For a cmdline based report summary just type the following to generate a report (including optional chart image file):
java -jar gcviewer-1.3x.jar gc.log summary.csv [chart.png] [-t PLAIN|CSV|CSV_TS|SIMPLE|SUMMARY]
When logfile rotation (-XX:+UseGCLogFileRotation) is enabled, the logfiles can be read at once:
java -jar gcviewer-1.3x.jar gc.log.0;gc.log.1;gc.log.2;gc.log.current summary.csv [chart.png] [-t PLAIN|CSV|CSV_TS|SIMPLE|SUMMARY]
Supported verbose:gc formats are:
Best results for non unified gc logging Oracle JDKs are achieved with: -Xloggc:
A few other options are supported, but most of the information generated is ignored by GCViewer
(the javadoc introduction of
https://github.com/chewiebug/GCViewer/blob/master/src/main/java/com/tagtraum/perf/gcviewer/imp/DataReaderSun1_6_0.java
shows the details).
Hendrik Schreiber wrote GCViewer up to 1.29. What you are seeing here is based
on his very good work.
Links to detailed descriptions of many JVM parameters relevant to garbage collection
can be found in the links section of https://github.com/chewiebug/GCViewer/wiki
There are two sections, where the results of the log analysis are shown.
One is the left side with the chart, the other the data panel on the right side.
In the following, the content of these sections is explained.
GCViewer shows a number of lines etc. in a chart (first tab). These are:
In the second tab it shows details about the events it parsed:
E.g. events like the following
24.187: [GC 24.188: [ParNew: 93184K->5464K(104832K), 0.0442895 secs]
93184K->5464K(1036928K), 0.0447149 secs]
[Times: user=0.39 sys=0.07, real=0.05 secs]
are shown in one line as
GC ParNew:
Events like these
4183.962: [Full GC 4183.962: [CMS: 32957K->40326K(932096K), 2.3313389 secs]
76067K->40326K(1036928K), [CMS Perm : 43837K->43453K(43880K)], 2.3339606 secs]
[Times: user=2.33 sys=0.01, real=2.33 secs]
are shown as
Full GC; CMS; CMS Perm
So for every line the text is extracted (not always every part of it). This allows
a user which is familiar with the text log files to find out more details about
the events that occurred.
These columns show the median, 75th percentile etc.
This are shows all stop-the-world pauses, that are not full gc pauses.
In this area all pauses are shown, which GCViewer considers as “full gc”
pauses. The current definition of a “full gc” is: Either the gc algorithm
prints “full gc” in its event name, or more than one generation (young,
old, permgen / metaspace) were involved during collection.
This area is only shown, if the gc log was written with the option
-XX:+PrintGCApplicationStoppedTime. To understand the meaning of this
metric, it is important to know about safepoints (see e.g.
http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html).
If GCViewer finds gc log lines like the following:
2017-03-29T14:37:12.812+0200: 8.832: [GC (Allocation Failure)
[PSYoungGen: 29146K->3457K(29184K)] 78228K->52539K(116736K), 0.0009340 secs]
[Times: user=0.00 sys=0.00, real=0.00 secs]
2017-03-29T14:37:12.813+0200: 8.833: Total time for which application
threads were stopped: 0.0010682 seconds, Stopping threads took: 0.0000155 seconds
GCViewer will report one event in the “Gc pauses” area and one in this area.
The pause duration reported for “Total time…” will be 0.0001342s
(0.0010682 (duration of safepoint pause) - 0.0009340 (duration of gc pause))
So GCViewer only calculates the additional overhead needed for the whole
safepoint on top of the gc pause.
If the event immediately before the “Total time…” event was not a any
kind of gc pause, but another “Total time…” event, then the whole pause
for “Total time…” will be recorded for this event. In this case the
safepoint was not caused by a gc pause.
This are contains information about concurrent collection cycles, if
the gc algorithm used them. The time reported here is spent while the
application threads are running. It is possible to read here, how long
concurrent gc operations took until they finished.
In the third tab the output of the parser is shown. If there were warnings
during the parsing process or other output, you can check there.
GCViewer provides some metrics to help you interpret the chart.
Note that some metrics based on averages are shown along with
their standard deviation. If it is obvious that the standard
deviation is fairly big in comparison to the average, the values
are grayed out, indicating that actual values are much smaller
or bigger than the average.
This is not a perfect tool. However, GCViewer can help you
getting a grip on finding out what’s going on in your application
with regards to garbage collection.
Here are some known limitations.
If you have problems with the IBM format, please check that
every line of information is really in one line and not wrapped.
The IBM format actually provides a lot more information than is
visualized.
Sun JDK 1.3.1/1.4 with -verbose:gc does not provide a timestamp.
Therefore values like ‘Total Time’, ‘Throughput’, and ‘Freed Mem/Min’
cannot be calculated.
CMS and G1 collector sometimes mix concurrent events with stop the world
collections in the output. In some cases the parser can recover from
such mixed lines, sometimes it can’t and will show an error message.
Concurrently collected garbage may not be reflected correctly in the
data panel.
CSV Comma Separated Values
The CSV format is quite useful for importing the data to a
spreadsheet application. However, it does not export all
data.
CSV_TS Comma Separated Values
CSV format using unix timestamp and one line per gc event.
PLAIN Plain Data
Plain text representation of the gc log. If written from Sun / Oracle gc log
it is usually compatible with HPjmeter.
SIMPLE Simple GC Log
Very simple representation of a gc log in the format
This format is compatible with gchisto (http://java.net/projects/gchisto)
SUMMARY
Detailed summary exporting all details about a gc log file (same as shown in data panel).
Provided are a German, an English and a Swedish localStrings.properties
file. If someone feels the need to translate these to another
language, please do so. I will be more than glad, to include it
in a future version of this tool.
If you happen to know when the application and GC log was started, you
can specify this time by right-clicking on the time ruler and entering
a start time.
Sun / Oracle VMs: If -XX:+PrintGCDateStamps was used, the proposed start time is
read from the gc log file.
If you are a developer, you may fork (http://help.github.com/fork-a-repo/)
the repository on http://github.com/chewiebug/GCViewer and send me a
pull request (http://help.github.com/send-pull-requests/). If you plan a bigger
change I’d appreciate a notice in advance.
To file a bug report, please open an issue on
http://github.com/chewiebug/GCViewer/issues or send an email to
[email protected] with a description of the error, the
name of the JVM that produced the GC data and all used flags along
with a sample GC log file.
Download and install Maven3 from http://maven.apache.org/
Download the src distribution of GCViewer.
Execute from the GCViewer base directory (same as pom.xml):
mvn clean install
The executable jar will be placed in the target directory.
Enjoy!
Joerg Wuethrich
http://github.com/chewiebug/GCViewer
[email protected]