oracle/graal · error · IllegalArgumentException

Unrecognized unit prefix

Error message

Unrecognized unit prefix: {size} use `T`, `G`, `M`, or `k`.

What it means

The final switch of the size converter accepts only T/t, G/g, M/m, K/k as the single unit character. Any other character after the digits (e.g. 'B', 'b', 'i') falls to default and throws, advising the four supported prefixes.

Solutions

  1. Use T, G, M, or k (case-insensitive) as the unit.
  2. For plain bytes, omit the unit entirely.
  3. Beware that 'b' is NOT accepted - use no unit for bytes.

Example fix

# before
--java.MaxDirectMemorySize=16B

# after
--java.MaxDirectMemorySize=16   # bytes, no unit
Defensive patterns

Strategy: validation

Validate before calling

if (!size.matches("\\d+([TtGgMmKk])?")) throw new ConfigException("Unit must be T/G/M/k: " + size);

Type guard

static boolean validUnit(String s) { return s != null && s.matches("\\d+[TtGgMmKk]?"); }

Prevention

When it happens

Trigger: --java.MaxDirectMemorySize=16B, 1b, or 1x - the value starts with digits and has exactly one trailing character, but that character is not T/G/M/K.

Common situations: Writing '16B' for bytes (use a plain number instead); binary-unit 'i' from GiB notation; typos.

Related errors


AI-assisted analysis of oracle/graal@a66e9ccd1d (2026-08-14). Data as JSON: /api/errors/04de453703b49d79. Report an issue: GitHub.

Appendix: source

Thrown at espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/EspressoOptions.java:584

            long result = Long.parseLong(size.substring(0, idx));

            if (idx < len) {
                switch (size.charAt(idx)) {
                    case 'T': // fallthrough
                    case 't':
                        return result * K * K * K * K;
                    case 'G': // fallthrough
                    case 'g':
                        return result * K * K * K;
                    case 'M': // fallthrough
                    case 'm':
                        return result * K * K;
                    case 'K': // fallthrough
                    case 'k':
                        return result * K;
                    default:
                        throw new IllegalArgumentException("Unrecognized unit prefix: " + size + " use `T`, `G`, `M`, or `k`.");
                }
            }
            return result;

        }
    });

    @Option(help = "Maximum total size of NIO direct-buffer allocations.", //
                    category = OptionCategory.EXPERT, //
                    stability = OptionStability.STABLE, usageSyntax = "<size>[<unit>]") //
    public static final OptionKey<Long> MaxDirectMemorySize = new OptionKey<>(-1L, SIZE_OPTION_TYPE);

    @Option(help = "Load native agents from standard library paths. \\n" +
                    "Keys represent the agent library name, values are the corresponding agent options.\\n" +
                    "Agents are not fully implemented yet.", //
                    category = OptionCategory.INTERNAL, //
                    stability = OptionStability.EXPERIMENTAL, //
                    usageSyntax = "<agentOptions>") //

View on GitHub (pinned to a66e9ccd1d)