java AIO 笔记
所属分类 AIO
浏览量 64
AIO是一种异步非阻塞IO模型,它提供了从建立连接到读、写的全异步操作;
AIO在JDK 1.7版本中被集成在JDK的nio包中,因此AIO也被称作是NIO2.0;
AIO的核心思想是操作系统在完成IO操作后主动通知应用程序,而不是应用程序不断轮询IO对象;
AIO简化了程序的编写,流的读取和写入都由操作系统完成,省去了NIO中程序要遍历事件通知队列(Selector)的步骤
AIO(Asynchronous I/O) NIO2.0
AsynchronousServerSocketChannel
AsynchronousSocketChannel
CompletionHandler
Java AIO的本质可以概括为 选择器+线程池,即Epoll + ThreadPoolExecutor;
Java AIO在底层实现上依赖于操作系统的I/O机制(如Linux的epoll),并通过线程池来处理I/O事件
Java AIO的实现依赖于操作系统,Windows基于IOCP实现了AIO,而Linux目前只有基于epoll模拟实现的AIO
Java AIO与NIO的主要区别在于通知机制,
在java NIO中,当I/O操作准备好时,会通知应用程序;
在Java AIO中,当I/O操作完成时,会通知应用程序;
这种差异使得Java AIO在处理I/O完成后的后续操作时更加直接和高效
Java AIO基于通道(Channel)和缓冲区(Buffer),
通道负责向操作系统发起IO请求,缓冲区负责存储IO操作的数据
Java AIO在某些场景下表现优异,但也存在一些局限性。
例如,Java AIO在多核CPU环境下处理高并发请求时,可能会引发严重的锁竞争现象,导致性能无法充分发挥,
由于其复杂性和局限性,Netty等流行的网络框架选择移除对Java AIO的支持,转而使用NIO作为其I/O模型
Java AIO在某些情况下可能会遇到“死亡回调”的问题,
即在回调方法中再次调用回调方法,
这会导致无限递归,最终导致程序崩溃或性能下降。
2011年Java7发布,增加了AIO(NIO2.0),10几年了,平时使用的开发框架和中间件却还是以NIO为主(例如Netty、Mina,Web容器Tomcat、Undertow)
netty放弃AIO的理由
Not faster than NIO (epoll) on unix systems (which is true),
NIO 和 AIO 在 unix 系统上使用的都是 epoll 模式,本质都是一样的
Netty舍弃AIO的支持,
https://github.com/netty/netty/issues/2515
Netty移除AIO的一个主要原因是在性能上AIO并没有比NIO高。
Linux虽然有一套原生的AIO实现,但Java AIO并没有采用,而是用epoll来模拟实现
上一篇
下一篇
EPOLL IO_URING IOCP
doris 实用 SQL
java ByteBuffer flip
java AIO 使用注意点
JAVA AIO 例子 客户端发送与服务端接收消息
java AIO echo server