diff --git a/substratevm/src/com.oracle.svm.jfr/src/com/oracle/svm/jfr/JfrManager.java b/substratevm/src/com.oracle.svm.jfr/src/com/oracle/svm/jfr/JfrManager.java index 1a2543fd8b5d..d09fa662ecff 100644 --- a/substratevm/src/com.oracle.svm.jfr/src/com/oracle/svm/jfr/JfrManager.java +++ b/substratevm/src/com.oracle.svm.jfr/src/com/oracle/svm/jfr/JfrManager.java @@ -104,7 +104,7 @@ private static void initRecording() { Boolean disk = parseBoolean(args, JfrStartArgument.Disk); String path = args.get(JfrStartArgument.Filename); Long maxAge = parseDuration(args, JfrStartArgument.MaxAge); - Long maxSize = parseLong(args, JfrStartArgument.MaxSize); + Long maxSize = parseMaxSize(args, JfrStartArgument.MaxSize); Boolean dumpOnExit = parseBoolean(args, JfrStartArgument.DumpOnExit); Boolean pathToGcRoots = parseBoolean(args, JfrStartArgument.PathToGCRoots); @@ -160,19 +160,6 @@ private static Boolean parseBoolean(Map args, JfrStart } } - private static Long parseLong(Map args, JfrStartArgument key) throws IllegalArgumentException { - String value = args.get(key); - if (value == null) { - return null; - } else { - try { - return Long.valueOf(value); - } catch (NumberFormatException ex) { - throw UserError.abort("Could not parse JFR argument '" + key.cmdLineKey + "=" + value + "'. Expected a number."); - } - } - } - private static Long parseDuration(Map args, JfrStartArgument key) { String value = args.get(key); if (value != null) { @@ -206,7 +193,7 @@ private static Long parseDuration(Map args, JfrStartAr return Duration.ofMinutes(time).toNanos(); } else if ("h".equals(unit)) { return Duration.ofHours(time).toNanos(); - } else if ("f".equals(unit)) { + } else if ("d".equals(unit)) { return Duration.ofDays(time).toNanos(); } throw new IllegalArgumentException("Unit is invalid."); @@ -217,6 +204,45 @@ private static Long parseDuration(Map args, JfrStartAr return null; } + private static Long parseMaxSize(Map args, JfrStartArgument key) { + final String value = args.get(key); + if (value != null) { + try { + int idx = indexOfFirstNonDigitCharacter(value); + long number; + try { + number = Long.parseLong(value.substring(0, idx)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Expected a number."); + } + + // Missing unit, number is plain bytes + if (idx == value.length()) { + return number; + } + + final char unit = value.substring(idx).charAt(0); + switch (unit) { + case 'k': + case 'K': + return number * 1024; + case 'm': + case 'M': + return number * 1024 * 1024; + case 'g': + case 'G': + return number * 1024 * 1024 * 1024; + default: + // Unknown unit, number is treated as plain bytes + return number; + } + } catch (IllegalArgumentException e) { + throw UserError.abort("Could not parse JFR argument '" + key.cmdLineKey + "=" + value + "'. " + e.getMessage()); + } + } + return null; + } + private static int indexOfFirstNonDigitCharacter(String durationText) { int idx = 0; while (idx < durationText.length() && Character.isDigit(durationText.charAt(idx))) {