package com.ibm.nmon.parser.gc.state; import com.ibm.nmon.parser.gc.GCParserContext; final class Java7GCCycle extends JavaGCCycle { static final Java7GCCycle INSTANCE = new Java7GCCycle(); private int compactionCount; @Override public GCState startElement(GCParserContext context, String elementName, String unparsedAttributes) { if ("mem".equals(elementName)) { context.parseAttributes(unparsedAttributes); String type = context.getAttribute("type"); if ("nursery".equals(type)) { calculateSizes(context, type, "free", "total"); } else if ("eden".equals(type)) { calculateSizes(context, "nursery", "free", "total"); } else if ("tenure".equals(type)) { calculateSizes(context, "tenured", "free", "total"); } } else if ("scavenger-info".equals(elementName)) { context.parseAttributes(unparsedAttributes); context.setValue("GCSTAT", "tiltratio", "tiltratio"); } else if ("memory-copied".equals(elementName)) { context.parseAttributes(unparsedAttributes); String type = context.getAttribute("type"); if ("nursery".equals(type) || "eden".equals(type)) { context.setValue("GCMEM", "flipped", "objects"); context.setValue("GCMEM", "flipped_bytes", "bytes"); } else if ("tenure".equals(type)) { context.setValue("GCMEM", "tenured", "objects"); context.setValue("GCMEM", "tenured_bytes", "bytes"); } } else if ("finalization".equals(elementName)) { context.parseAttributes(unparsedAttributes); context.setValue("GCSTAT", "finalizers", "enqueued"); } else if ("references".equals(elementName)) { context.parseAttributes(unparsedAttributes); context.setValue("GCSTAT", context.getAttribute("type"), "cleared"); } else if ("compact-info".equals(elementName)) { context.parseAttributes(unparsedAttributes); context.setValue("GCCOUNT", "compaction_count", ++compactionCount); context.setValue("GCMEM", "moved", "movecount"); context.setValue("GCMEM", "moved_bytes", "movebytes"); } else if ("concurrent-collection-start".equals(elementName)) { context.parseAttributes(unparsedAttributes); context.setValueDiv1000("GCSINCE", "con_mark", "intervalms"); } else if ("gc-op".equals(elementName)) { context.parseAttributes(unparsedAttributes); String type = context.getAttribute("type"); if ("mark".equals(type)) { context.setValue("GCTIME", "mark_ms", "timems"); } else if ("sweep".equals(type)) { context.setValue("GCTIME", "sweep_ms", "timems"); } else if ("compact".equals(type)) { context.setValue("GCTIME", "compact_ms", "timems"); } } else if ("remembered-set".equals(elementName)) { // TODO handle remembered-set // context.parseAttributes(unparsedAttributes); // calculateSizes(context, "tenured", "freebytes", "totalbytes"); } else if ("gc-end".equals(elementName)) { context.parseAttributes(unparsedAttributes); String type = context.getAttribute("type"); if ("global".equals(type)) { context.setValue("GCTIME", "tenured_ms", "durationms"); } else if ("scavenge".equals(type)) { context.setValue("GCTIME", "nursery_ms", "durationms"); } } return this; } @Override public GCState endElement(GCParserContext context, String elementName) { if ("gc-start".equals(elementName)) { beforeGC = false; return this; } else if ("cycle-end".equals(elementName)) { calculateTotalSizes(context); return Java7GC.INSTANCE; } else { return this; } } @Override public void reset() { super.reset(); compactionCount = 0; } private Java7GCCycle() { super(); } }