This seems to be a problem in the Windows implementation of ProcessBuilder().inheritIO()
This is the root cause of JDK-8366731
The child process doesn't read from its stdin, but when it tries to write a non-trivial amount of data to its stdout, the writes get blocked
https://bugs.openjdk.org/secure/attachment/115994/Test.java
========================
import java.io.*;
public class Test {
public static void main(String args[]) throws Throwable {
if (args.length == 2) {
System.out.close();
ProcessBuilder pb = new ProcessBuilder().inheritIO()
.command(args[0], "Test",
args[0], // location of java.exe
args[1], // num loops in child process
"child");
var env = pb.environment();
Process process = pb.start();
process.waitFor();
System.out.println("Done");
} else {
int n = Integer.parseInt(args[1]);
for (int i = 0; i < n; i++) {
System.out.println("Hello");
}
}
}
}
========================
$ javac Test.java
$ bin/java.exe Test bin/java.exe 0
[completes with no output]
$ bin/java.exe Test bin/java.exe 1
[completes with no output]
$ bin/java.exe Test bin/java.exe 10000
[gets stuck ...]
"main" #3 [52572] prio=5 os_prio=0 cpu=62.50ms elapsed=35.60s tid=0x0000021373b08f10 nid=52572 runnable [0x000000ae19bfe000]
java.lang.Thread.State: RUNNABLE
Thread: 0x0000021373b08f10 [0xcd5c] State: _at_safepoint _at_poll_safepoint 0
JavaThread state: _thread_in_native
at java.io.FileOutputStream.writeBytes(java.base@26-internal/Native Method)
at java.io.FileOutputStream.write(java.base@26-internal/FileOutputStream.java:352)
at java.lang.System$Out.write(java.base@26-internal/System.java:1910)
at java.io.BufferedOutputStream.flushBuffer(java.base@26-internal/BufferedOutputStream.java:123)
at java.io.BufferedOutputStream.flush(java.base@26-internal/BufferedOutputStream.java:203)
- locked <0x0000000640c09040> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(java.base@26-internal/PrintStream.java:541)
- locked <0x0000000640c09008> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(java.base@26-internal/StreamEncoder.java:220)
at sun.nio.cs.StreamEncoder.implFlushBuffer(java.base@26-internal/StreamEncoder.java:315)
at sun.nio.cs.StreamEncoder.flushBuffer(java.base@26-internal/StreamEncoder.java:101)
- locked <0x0000000640c09138> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(java.base@26-internal/OutputStreamWriter.java:179)
at java.io.PrintStream.writeln(java.base@26-internal/PrintStream.java:690)
- locked <0x0000000640c09008> (a java.io.PrintStream)
at java.io.PrintStream.println(java.base@26-internal/PrintStream.java:1004)
at Test.main(Test.java:23)
=================================
EXPECTED:
Child inherited a closed System.out. So printing to it should have no effect (same as in the parent process)
ACTUAL:
Child process gets stuck when trying to write to System.out.
This is the root cause of JDK-8366731
The child process doesn't read from its stdin, but when it tries to write a non-trivial amount of data to its stdout, the writes get blocked
https://bugs.openjdk.org/secure/attachment/115994/Test.java
========================
import java.io.*;
public class Test {
public static void main(String args[]) throws Throwable {
if (args.length == 2) {
System.out.close();
ProcessBuilder pb = new ProcessBuilder().inheritIO()
.command(args[0], "Test",
args[0], // location of java.exe
args[1], // num loops in child process
"child");
var env = pb.environment();
Process process = pb.start();
process.waitFor();
System.out.println("Done");
} else {
int n = Integer.parseInt(args[1]);
for (int i = 0; i < n; i++) {
System.out.println("Hello");
}
}
}
}
========================
$ javac Test.java
$ bin/java.exe Test bin/java.exe 0
[completes with no output]
$ bin/java.exe Test bin/java.exe 1
[completes with no output]
$ bin/java.exe Test bin/java.exe 10000
[gets stuck ...]
"main" #3 [52572] prio=5 os_prio=0 cpu=62.50ms elapsed=35.60s tid=0x0000021373b08f10 nid=52572 runnable [0x000000ae19bfe000]
java.lang.Thread.State: RUNNABLE
Thread: 0x0000021373b08f10 [0xcd5c] State: _at_safepoint _at_poll_safepoint 0
JavaThread state: _thread_in_native
at java.io.FileOutputStream.writeBytes(java.base@26-internal/Native Method)
at java.io.FileOutputStream.write(java.base@26-internal/FileOutputStream.java:352)
at java.lang.System$Out.write(java.base@26-internal/System.java:1910)
at java.io.BufferedOutputStream.flushBuffer(java.base@26-internal/BufferedOutputStream.java:123)
at java.io.BufferedOutputStream.flush(java.base@26-internal/BufferedOutputStream.java:203)
- locked <0x0000000640c09040> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(java.base@26-internal/PrintStream.java:541)
- locked <0x0000000640c09008> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(java.base@26-internal/StreamEncoder.java:220)
at sun.nio.cs.StreamEncoder.implFlushBuffer(java.base@26-internal/StreamEncoder.java:315)
at sun.nio.cs.StreamEncoder.flushBuffer(java.base@26-internal/StreamEncoder.java:101)
- locked <0x0000000640c09138> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(java.base@26-internal/OutputStreamWriter.java:179)
at java.io.PrintStream.writeln(java.base@26-internal/PrintStream.java:690)
- locked <0x0000000640c09008> (a java.io.PrintStream)
at java.io.PrintStream.println(java.base@26-internal/PrintStream.java:1004)
at Test.main(Test.java:23)
=================================
EXPECTED:
Child inherited a closed System.out. So printing to it should have no effect (same as in the parent process)
ACTUAL:
Child process gets stuck when trying to write to System.out.
- causes
-
JDK-8366731 Closed System.out/err causes hanging with -XX:AOTCacheOutput
-
- Open
-