< 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 >