openjdk/jdk · error · IOException

Server failed to initialize

Error message

Server failed to initialize: {}

What it means

IOException from Client.startNewServer(): the client forked a javacserver daemon process, but it failed to initialize (the awaited readiness signal threw), so the client logs the daemon's entire stdout/stderr and its exit code, then rethrows with the original exception as cause. The daemon's output printed just before this exception is the primary diagnostic.

Solutions

  1. Read the 'Process output:' block in the log — it contains the daemon's actual startup error.
  2. Check the 'Process exit code' line: non-zero exit usually means JVM options/classpath issues; missing exit code means it hung.
  3. Verify the port file directory is writable and not full.
  4. Remove stale port files and leftover server processes, then retry so a clean daemon is forked.
Defensive patterns

Strategy: fallback

Validate before calling

// pre-flight the forked JVM command before relying on the server
String javaBin = Paths.get(System.getProperty("java.home"), "bin", "java").toString();
ProcessBuilder check = new ProcessBuilder(javaBin, "-version").redirectErrorStream(true);
if (check.start().waitFor() != 0)
    throw new IOException("cannot start a JVM for javacserver: " + javaBin);

Try / catch

try {
    client.startNewServer();
} catch (IOException e) {
    // message already contains the daemon's stdout/stderr; fall back to in-process javac
    Log.error("javacserver unavailable, falling back to local javac", e);
    runLocalJavac(args); // graceful degradation instead of failing the build
}

Prevention

When it happens

Trigger: The spawned server JVM exits or hangs during startup — incompatible JVM options, port file creation failure (permissions on the port file directory), or a classpath problem in the forked command.

Common situations: java.home changed after a JDK upgrade so the fork command is stale; the /tmp or build dir used for the port file is not writable; memory limits (ulimit/cgroups) preventing the second JVM from starting.

Related errors


AI-assisted analysis of openjdk/jdk@88dfb74bbe (2026-08-14). Data as JSON: /api/errors/d66ae27dc0f55482. Report an issue: GitHub.

Appendix: source

Thrown at make/langtools/tools/javacserver/client/Client.java:188

            // Throws an IOException if no valid values materialize
            conf.portFile().waitForValidValues();
        } catch (IOException ex) {
            // Process was started, but server failed to initialize. This could
            // for instance be due to the JVM not finding the server class,
            // or the server running in to some exception early on.
            Log.error("javacserver server process failed to initialize: " + ex.getMessage());
            Log.error("Process output:");
            Reader serverStdoutStderr = new InputStreamReader(serverProcess.getInputStream());
            try (BufferedReader br = new BufferedReader(serverStdoutStderr)) {
                br.lines().forEach(Log::error);
            }
            Log.error("<End of process output>");
            try {
                Log.error("Process exit code: " + serverProcess.exitValue());
            } catch (IllegalThreadStateException e) {
                // Server is presumably still running.
            }
            throw new IOException("Server failed to initialize: " + ex.getMessage(), ex);
        }
    }
}

View on GitHub (pinned to 88dfb74bbe)