【Java编程性能调优】解决高并发下I/O瓶颈

  Java 的传统 I/O 开始是基于 InputStream 和 OutputStream 两个操作流实现的,这种流操作是以字节为单位,如果在高并发、大数据场景中,很容易导致阻塞,因此这种操作的性能是非常差的。还有,输出数据从用户空间复制到内核空间,再复制到输出设备,这样的操作会增加系统的性能开销。   传统 I/O 后来使用了 Buffer 优化了“阻塞”这个性能问题,以缓冲块作为最小单位,但相比整体性能来说依然不尽人意。   于是 NIO 发布,它是基于缓冲块为单位的流操作,在 Buffer 的基础上,新增了两个组件“管道和多路复用器”,实现了非阻塞 I/O,NIO 适用于发生大量 I/O 连接请求的场景,这三个组件共同提升了 I/O 的整体性能。

  在 JDK1.7 版本中,Java 发布了 NIO 的升级包 NIO2,也就是 AIO。AIO 实现了真正意义上的异步 I/O,它是直接将 I/O 操作交给操作系统进行异步处理。这也是对 I/O 操作的一种优化,那为什么现在很多容器的通信框架都还是使用 NIO 呢?   因为异步 I/O 模型在 Linux 内核中没有实现,AIO 并未真正使用操作系统所提供的异步 I/O,它仍然使用 poll 或 epoll,并将 API 封装为异步 I/O 的样子,但是其本质仍然是同步非阻塞 I/O,加上第三方产品的出现,Java 网络编程明显落后,所以没有成为主流。
经验分享 程序员 微信小程序 职场和发展