diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueFormatter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueFormatter.java index 9a8aa05d996..84b108b3d70 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueFormatter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueFormatter.java @@ -57,7 +57,6 @@ public final class ValueFormatter { } } - private static final NumberFormat NUMBER_FORMAT = NumberFormat.getNumberInstance(); private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss"); private static final Duration MICRO_SECOND = Duration.ofNanos(1_000); private static final Duration SECOND = Duration.ofSeconds(1); @@ -69,6 +68,12 @@ public final class ValueFormatter { private static final int DISPLAY_NANO_DIGIT = 3; private static final int BASE = 10; + // -XX:FlightRecorderOptions:repository= triggers an upcall + // which will load this class. If NumberFormat.getNumberInstance() + // is called during startup, locale settings will not take effect. + // Workaround is to create an instance lazily. See numberFormatInstance(). + private static NumberFormat NUMBER_FORMAT; + public static String formatTimespan(Duration dValue, String separation) { if (dValue == null) { return "0"; @@ -110,8 +115,15 @@ public final class ValueFormatter { } } + private static NumberFormat numberFormatInstance() { + if (NUMBER_FORMAT == null) { + NUMBER_FORMAT = NumberFormat.getNumberInstance(); + } + return NUMBER_FORMAT; + } + public static String formatNumber(Number n) { - return NUMBER_FORMAT.format(n); + return numberFormatInstance().format(n); } public static String formatDuration(Duration d) {