Because MRI is green threaded, almost all IO operations it performs are performed asynchronously using select. This allows it to schedule new green threads, and also allows threads to safely receive events without damaging their associated IO channels/streams/descriptors.
JRuby's IO operations must be globally examined and in most cases it's likely that instead of a blocking call we should be using a nonblocking call combined with a selector. See the fix for JRUBY-1452 for an example of such a change (though no guarantees on whether it's kosher NIO or not).