model.setFormat(GCModel.Format.IBM_VERBOSE_GC);
// Initialize local variables
int state = 0;
String line = null;
GCEvent event = null;
int freed = 0;
int previousCycle = 0;
int currentCycle = 0;
long basetime = 0;
// Initialize date formatter
cycleStartGCFormat = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
// Read the GC data lines
while ((line = in.readLine()) != null) {
final String trimmedLine = line.trim();
// GC Data line always start with GC
if (!"".equals(trimmedLine) && !trimmedLine.startsWith("GC")) {
if (LOG.isLoggable(Level.INFO)) LOG.info("Malformed line (" + in.getLineNumber() + "): " + line);
state = 0;
}
switch (state) {
case 0:
if (line.indexOf("GC:") != -1) {
// This is the start of the GC log
event = new GCEvent();
event.setType(AbstractGCEvent.Type.GC);
event.setPreUsed(parseInitialHeap(line));
event.setPostUsed(event.getPreUsed());
event.setTotal(event.getPreUsed());
model.add(event);
event = null;
// stay in state 0
break;
}
else if (line.indexOf("collection starting") != -1) {
// This is the start of a GC event
event = new GCEvent();
event.setType(AbstractGCEvent.Type.GC);
final long time = parseGCCycleStart(line);
if (basetime == 0) basetime = time;
event.setTimestamp((time - basetime)/1000.0d);
state++;
break;
}
break;
case 1:
// Collect data to add to the event
if (line.indexOf("current heap(KB) ") != -1) {
event.setTotal(parseTotalAfterGC(line));
break;
} else if (line.indexOf("collect (milliseconds) ") != -1) {
event.setPause(parsePause(line));
break;
} else if (line.indexOf("collected(KB) ") != -1) {
freed = parseFreed(line);
break;
} else if (line.indexOf("current cycle allocation(KB) ") != -1) {
previousCycle = parsePreviousCycle(line);
currentCycle = parseCurrentCycle(line);
event.setPreUsed((event.getTotal() - previousCycle - currentCycle) + freed);
event.setPostUsed((event.getTotal() - previousCycle - currentCycle));
break;
} else if (line.indexOf("collection ending") != -1) {
// End of GC event, store data in the model and reset variables
model.add(event);
event = null;