RFR: JDK-8249367: JShell uses 100% of one core all the time

Jan Lahoda jan.lahoda at oracle.com
Wed Jul 15 12:15:08 UTC 2020


Hi,

JShell consumes basically a 100% of one CPU thread on Windows all the 
time while waiting for a user input. The reason is that:
-JShell's StopDetectingInputStream invokes "read()" method  on 
NonBlockingReaderInputStream (without a timeout, which is an addition of 
JLine's non blocking streams and readers), which is converted to a read 
with timeout 0. The NonBlockingReaderInputStream then delegates to 
NonBlockingPumpReader, using its read method with timeout 0. But with 
timeout zero, this particular reader returns immediately, and because 
there was no input, and no timeout set to NonBlockingReaderInputStream, 
it will loop and ask the NonBlockingPumpReader again, and ultimately 
NonBlockingReaderInputStream.read spins in a loop.

The ultimate problem is, I believe, in NonBlockingPumpReader, which 
should not return immediately for timeout 0 (other non blocking 
streams/readers wait indefinitely for input for timeout 0). I have 
filled a bug to JLine for this:
https://github.com/jline/jline3/issues/552

But, mostly as a workaround, I suggest that StopDetectingInputStream 
uses a timeout while reading from non blocking streams. That should be 
safe, and we can revert to the current state when the above bug is fixed.

Proposed patch:
http://cr.openjdk.java.net/~jlahoda/8249367/webrev.00/

JBS:
https://bugs.openjdk.java.net/browse/JDK-8249367

What do you think?

Thanks,
     Jan


More information about the kulla-dev mailing list