From d215b64362c4ede61c8ba87b5f3f57bce4785d15 Mon Sep 17 00:00:00 2001 From: buchgr Date: Thu, 9 Aug 2018 01:18:53 -0700 Subject: [PATCH] Fix StackOverflowError on Windows. Fixes #5730 We found that with JDK9 and up Bazel would sometimes crash with a StackOverflowError in one of the Command-Accumulator-Thread-* threads. We experimentally found that this error was due to these threads being constrained to a 32KiB stack size. The default stack size for JVM threads on most 64-bit systems is 1MiB (So that's 3% of the default). The purpose of the Command-Accumulator-Threads is to read stdout/stderr from processes that Bazel launches locally. The proposed fix is to just use the system default stack size for these threads. The alternative is to increase the size limit to some arbitrary number that happens to work, but this is likely premature optimization and I'd like to avoid that if possible. We further found that this code even predates Blaze/Bazel and is from 2005. PiperOrigin-RevId: 208009940 --- .../com/google/devtools/build/lib/shell/Consumers.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/shell/Consumers.java b/src/main/java/com/google/devtools/build/lib/shell/Consumers.java index 94e2d743497865..3b11c2fd0db495 100644 --- a/src/main/java/com/google/devtools/build/lib/shell/Consumers.java +++ b/src/main/java/com/google/devtools/build/lib/shell/Consumers.java @@ -244,13 +244,8 @@ public void waitForCompletion() throws IOException { } } - /** - * Factory which produces threads with a 32K stack size. - */ private static class AccumulatorThreadFactory implements ThreadFactory { - private static final int THREAD_STACK_SIZE = 32 * 1024; - private static AtomicInteger threadInitNumber = new AtomicInteger(0); @Override @@ -258,13 +253,11 @@ public Thread newThread(final Runnable runnable) { final Thread t = new Thread(null, runnable, - "Command-Accumulator-Thread-" + threadInitNumber.getAndIncrement(), - THREAD_STACK_SIZE); + "Command-Accumulator-Thread-" + threadInitNumber.getAndIncrement()); // Don't let this thread hold up JVM exit t.setDaemon(true); return t; } - } /**