If linux kernel> = 2.6 is found, then java.nio.channels.spi.SelectorProvider will use epoll.
Here is a fragment of the DefaultSelectorProvider.java source (from Java 7):
public static SelectorProvider create() { String osname = AccessController.doPrivileged( new GetPropertyAction("os.name")); if ("SunOS".equals(osname)) { return new sun.nio.ch.DevPollSelectorProvider(); } // use EPollSelectorProvider for Linux kernels >= 2.6 if ("Linux".equals(osname)) { String osversion = AccessController.doPrivileged( new GetPropertyAction("os.version")); String[] vers = osversion.split("\\.", 0); if (vers.length >= 2) { try { int major = Integer.parseInt(vers[0]); int minor = Integer.parseInt(vers[1]); if (major > 2 || (major == 2 && minor >= 6)) { return new sun.nio.ch.EPollSelectorProvider(); } } catch (NumberFormatException x) { // format not recognized } } } return new sun.nio.ch.PollSelectorProvider(); }
Both NIO 2 and "original" (let it be called NIO 1) should use low-level event notification mechanisms or the Linux AIO API (which is relatively new), because you never know what the kernel of your application will be on the machine starts up. I would not be surprised to see that NIO 2 actually uses Linux AIO or POSIX AIO (they are completely different).
source share