< prev index next >

test/gc/g1/plab/lib/LogParser.java

Print this page

        

*** 20,36 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package gc.g1.plab.lib; ! import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * LogParser class parses VM output to get PLAB and ConsumptionStats values. * * Typical GC log with PLAB statistics (options - -Xlog:gc=debug,gc+plab=debug) looks like: --- 20,38 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package gc.g1.plab.lib; ! import java.util.Arrays; import java.util.HashMap; + import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; + import java.util.stream.Collectors; /** * LogParser class parses VM output to get PLAB and ConsumptionStats values. * * Typical GC log with PLAB statistics (options - -Xlog:gc=debug,gc+plab=debug) looks like:
*** 42,54 **** * [0.330s][debug][gc,plab ] GC(0) Old other allocation: region end waste: 0B, regions filled: 1, direct allocated: 41704B, failure used: 0B, failure wasted: 0B * [0.330s][debug][gc,plab ] GC(0) Old sizing: calculated: 11608B, actual: 11608B */ final public class LogParser { - // Name for GC ID field in report. - public final static String GC_ID = "gc_id"; - /** * Type of parsed log element. */ public static enum ReportType { SURVIVOR_STATS, --- 44,53 ----
*** 56,66 **** } private final String log; // Contains Map of PLAB statistics for given log. ! private final Map<Long, Map<ReportType, Map<String, Long>>> report; // GC ID private static final Pattern GC_ID_PATTERN = Pattern.compile("\\[gc,plab\\s*\\] GC\\((\\d+)\\)"); // Pattern for extraction pair <name>: <numeric value> private static final Pattern PAIRS_PATTERN = Pattern.compile("\\w* \\w+:\\s+\\d+"); --- 55,65 ---- } private final String log; // Contains Map of PLAB statistics for given log. ! private final PlabReport report; // GC ID private static final Pattern GC_ID_PATTERN = Pattern.compile("\\[gc,plab\\s*\\] GC\\((\\d+)\\)"); // Pattern for extraction pair <name>: <numeric value> private static final Pattern PAIRS_PATTERN = Pattern.compile("\\w* \\w+:\\s+\\d+");
*** 89,146 **** * Returns the GC log entries for Survivor and Old stats. * The entries are represented as a map of gcID to the StatMap. * * @return The log entries for the Survivor and Old stats. */ ! public Map<Long, Map<ReportType, Map<String, Long>>> getEntries() { return report; } ! private Map<Long, Map<ReportType, Map<String, Long>>> parseLines() throws NumberFormatException { Scanner lineScanner = new Scanner(log); ! Map<Long, Map<ReportType, Map<String, Long>>> allocationStatistics = new HashMap<>(); Optional<Long> gc_id; while (lineScanner.hasNextLine()) { String line = lineScanner.nextLine(); ! gc_id = getGcId(line); if (gc_id.isPresent()) { Matcher matcher = PAIRS_PATTERN.matcher(line); if (matcher.find()) { ! Map<ReportType, Map<String, Long>> oneReportItem; ! ReportType reportType; ! ! if (!allocationStatistics.containsKey(gc_id.get())) { ! allocationStatistics.put(gc_id.get(), new EnumMap<>(ReportType.class)); } ! if (line.contains("Young")) { ! reportType = ReportType.SURVIVOR_STATS; ! } else { ! reportType = ReportType.OLD_STATS; ! } ! ! oneReportItem = allocationStatistics.get(gc_id.get()); ! if (!oneReportItem.containsKey(reportType)) { ! oneReportItem.put(reportType, new HashMap<>()); } // Extract all pairs from log. ! Map<String, Long> plabStats = oneReportItem.get(reportType); do { String pair = matcher.group(); String[] nameValue = pair.replaceAll(": ", ":").split(":"); ! plabStats.put(nameValue[0].trim(), Long.parseLong(nameValue[1])); } while (matcher.find()); } } } ! return allocationStatistics; } ! private Optional<Long> getGcId(String line) { ! Matcher number = GC_ID_PATTERN.matcher(line); if (number.find()) { return Optional.of(Long.parseLong(number.group(1))); } return Optional.empty(); } } --- 88,196 ---- * Returns the GC log entries for Survivor and Old stats. * The entries are represented as a map of gcID to the StatMap. * * @return The log entries for the Survivor and Old stats. */ ! public PlabReport getEntries() { return report; } ! private PlabReport parseLines() throws NumberFormatException { Scanner lineScanner = new Scanner(log); ! PlabReport plabReport = new PlabReport(); Optional<Long> gc_id; while (lineScanner.hasNextLine()) { String line = lineScanner.nextLine(); ! gc_id = getGcId(line, GC_ID_PATTERN); if (gc_id.isPresent()) { Matcher matcher = PAIRS_PATTERN.matcher(line); if (matcher.find()) { ! if (!plabReport.containsKey(gc_id.get())) { ! plabReport.put(gc_id.get(), new PlabGCStatistics()); } + ReportType reportType = line.contains("Young") ? ReportType.SURVIVOR_STATS : ReportType.OLD_STATS; ! PlabGCStatistics gcStat = plabReport.get(gc_id.get()); ! if (!gcStat.containsKey(reportType)) { ! gcStat.put(reportType, new PlabInfo()); } // Extract all pairs from log. ! PlabInfo plabInfo = gcStat.get(reportType); do { String pair = matcher.group(); String[] nameValue = pair.replaceAll(": ", ":").split(":"); ! plabInfo.put(nameValue[0].trim(), Long.parseLong(nameValue[1])); } while (matcher.find()); } } } ! return plabReport; } ! private static Optional<Long> getGcId(String line, Pattern pattern) { ! Matcher number = pattern.matcher(line); if (number.find()) { return Optional.of(Long.parseLong(number.group(1))); } return Optional.empty(); } + + /** + * Extracts GC ID from log. + * + * @param line - one line of log. + * @return GC ID + */ + public static Long getGcIdFromLine(String line, Pattern pattern) { + Optional<Long> gcId = getGcId(line, pattern); + if (!gcId.isPresent()) { + System.out.println(line); + throw new RuntimeException("Cannot find GC ID in log."); + } + return gcId.get(); + } + + /** + * Returns Map<Long,PlabStatistics> which contains specified statistics for specified gc ids. + * @param specifiedGcId gc id to get + * @param type PLAB type + * @param fieldsName name of fields in PlabStatistics + * @return + **/ + public Map<Long, PlabInfo> getSpecifiedStats(List<Long> specifiedGcId, LogParser.ReportType type, List<String> fieldsName) { + return getSpecifiedStats(specifiedGcId, type, fieldsName, true); + } + + /** + * Returns PlabStatistics for specified GC ID. + * @param specifiedGcId + * @param type type of statistics + * @param fieldsName name of fields in PlabStatistics + * @return + **/ + public PlabInfo getSpecifiedStats(long specifiedGcId, LogParser.ReportType type, List<String> fieldsName) { + return getSpecifiedStats(Arrays.asList(specifiedGcId), type, fieldsName, true).get(specifiedGcId); + } + + /** + * Returns Map<Long,PlabStatistics> which contains specified statistics. Filters out specified gc ids. + * @param specifiedGcIdForExclude + * @param type + * @param fieldsName + * @return + **/ + public Map<Long, PlabInfo> getExcludedSpecifiedStats(List<Long> specifiedGcIdForExclude, LogParser.ReportType type, List<String> fieldsName) { + return getSpecifiedStats(specifiedGcIdForExclude, type, fieldsName, false); + } + + private Map<Long, PlabInfo> getSpecifiedStats(List<Long> gcIds, LogParser.ReportType type, List<String> fieldNames, boolean extractId) { + return new HashMap<>( + getEntries().entryStream() + .filter(gcLogItem -> extractId == gcIds.contains(gcLogItem.getKey())) + .collect(Collectors.toMap(gcLogItem -> gcLogItem.getKey(), + gcLogItem -> gcLogItem.getValue().get(type).filter(fieldNames) + ) + ) + ); + } }
< prev index next >