in analysis/gc-log/src/main/java/org/eclipse/jifa/gclog/parser/UnifiedG1OrGenerationalGCLogParser.java [203:240]
private static boolean parseHeap(AbstractGCLogParser parser, ParseRuleContext context, String s) {
GCModel model = parser.getModel();
String[] parts = GCLogUtil.splitBySpace(s);
if (parts.length != 2 && parts.length != 3 && parts.length != 6) {
return false;
}
String generationName = parts[0];
if (generationName.endsWith(":")) {
generationName = generationName.substring(0, generationName.length() - 1);
}
MemoryArea generation = MemoryArea.getMemoryArea(generationName);
if (generation == null) {
return false;
}
// format check done
GCEvent event = model.getLastEventOfGCID(context.get(GCID));
if (event == null) {
// log may be incomplete
return true;
}
if (event.getEventType() == CMS_CONCURRENT_MARK_SWEPT) {
event = event.getLastPhaseOfType(CMS_CONCURRENT_SWEEP);
if (event == null) {
return true;
}
}
long[] memories = GCLogUtil.parseMemorySizeFromTo(parts.length == 3 ? parts[2] :parts[1], 1);
// will multiply region size before calculating derived info for g1
GCMemoryItem item = new GCMemoryItem(generation, memories);
event.setMemoryItem(item);
if (parts.length == 6) {
event.setMemoryItem(new GCMemoryItem(MemoryArea.EDEN, GCLogUtil.parseMemorySizeFromTo(parts[3])));
event.setMemoryItem(new GCMemoryItem(MemoryArea.SURVIVOR, GCLogUtil.parseMemorySizeFromTo(parts[5])));
}
return true;
}