elastic/elasticsearch · error · UserException

78

78

Error message

encountered [%d] error%s parsing [%s]%s[%d]: encountered improperly formatted JVM option in [%s] on line number [%d]: [%s]%s

What it means

Thrown by JvmOptionsParser when one or more lines in a jvm.options file are malformed (caught as JvmOptionsFileParserException and rewrapped as UserException CONFIG). The message lists each invalid line with its file and line number.

Solutions

  1. Use the line number from the message to open jvm.options and inspect the exact offending line.
  2. Ensure every non-comment, non-blank line is a single valid JVM flag (-D, -X, or -XX:...).
  3. For values with spaces, use the appropriate JVM syntax (usually no spaces; use = for -D props).
  4. Re-run after editing to confirm zero parse errors.

Example fix

# jvm.options — before (line 42 malformed)
-Xmx4g extra

# after
-Xmx4g
Defensive patterns

Strategy: validation

Validate before calling

for (String line : Files.readAllLines(jvmOptionsFile)) {
    String t = line.trim();
    if (t.isEmpty() || t.startsWith("#")) continue;
    if (!t.startsWith("-D") && !t.startsWith("-X") && !t.startsWith("-XX:")) {
        throw new IllegalArgumentException("Invalid JVM option line: " + line);
    }
}

Try / catch

try {
    parser.jvmOptions(args, config, tmpDir, envOptions, substitutions, cliSysprops, mdh);
} catch (JvmOptionsFileParserException e) {
    throw new UserException(ExitCodes.CONFIG, "Fix jvm.options: " + e.invalidLines());
}

Prevention

When it happens

Trigger: A line in config/jvm.options or a vendor jvm.options file does not conform to the expected JVM-option syntax — e.g. contains stray characters, is not a -D/-X/-XX flag, or has whitespace in the middle of an option.

Common situations: Manually editing jvm.options and introducing a typo; copy-pasting a multi-word value without quoting; a CI pipeline templating jvm.options that emits a blank/garbage line.

Related errors


AI-assisted analysis of elastic/elasticsearch@db6a809a66 (2026-08-12). Data as JSON: /api/errors/a3eff1bdcf56d683. Report an issue: GitHub.

Appendix: source

Thrown at distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOptionsParser.java:128

                e.jvmOptionsFile(),
                System.lineSeparator()
            );
            StringBuilder msg = new StringBuilder(errorMessage);
            int count = 0;
            for (final Map.Entry<Integer, String> entry : e.invalidLines().entrySet()) {
                count++;
                final String message = String.format(
                    Locale.ROOT,
                    "[%d]: encountered improperly formatted JVM option in [%s] on line number [%d]: [%s]%s",
                    count,
                    e.jvmOptionsFile(),
                    entry.getKey(),
                    entry.getValue(),
                    System.lineSeparator()
                );
                msg.append(message);
            }
            throw new UserException(ExitCodes.CONFIG, msg.toString());
        }
    }

    private List<String> jvmOptions(
        ServerArgs args,
        final Path config,
        Path tmpDir,
        final String esJavaOpts,
        final Map<String, String> substitutions,
        final Map<String, String> cliSysprops,
        final MachineDependentHeap machineDependentHeap
    ) throws InterruptedException, IOException, JvmOptionsFileParserException, UserException {

        final List<String> jvmOptions = readJvmOptionsFiles(config);

        if (esJavaOpts != null) {
            jvmOptions.addAll(Arrays.stream(esJavaOpts.split("\\s+")).filter(Predicate.not(String::isBlank)).toList());
        }

View on GitHub (pinned to db6a809a66)