您的位置:首页 > 运维架构 > Tomcat

Tomcat三种运行模式(BIO, NIO, APR)

2017-07-10 15:23 246 查看

Tomcat三种运行模式(BIO, NIO, APR)

Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一。不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式,那么这三种运行模式有什么区别呢,我们又如何修改Tomcat Connector的运行模式来提高Tomcat的运行性能呢?

1.同步,异步,阻塞,非阻塞场景举例

同步:自己的事情自己做(使用同步IO时,JAVA自己处理IO读写)

异步:找个小弟帮你做(使用异步IO时,JAVA将IO读写委托给OS(系统)处理,需要将数据缓冲区地址和大小传给OS,OS需要支持异步IO和操作API)

阻塞:吃饭的时候只能一口一口吃,下一口只能等待(使用阻塞IO时,JAVA调用会一直阻塞到读写完成才返回)

非阻塞:烧水的同时,你可以去洗杯子,可以去看电视(使用非阻塞IO的时候,如果不能读写JAVA调用会马上返回,当IO事件分发器会通知可读写时再进行读写,不断循环直到读写完成)

2.JAVA对BIO,NIO和AIO的支持

BIO: 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理

3.BIO,NIO,AIO适用场景分析

BIO:适用连接数较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。

NIO:适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂。

AIO:适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂。

4.Tomcat中BIO,NIO,APR模式介绍

BIO(blocking I/O):阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。

NIO:是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能

APR:(Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

总结

个人觉得在 tomcat bio、nio、apr 模式中,每种都会有各自适用的场合,apr其实也是nio只不过他是操作系统级别的支持,nio是由java本身的nio支持的,也不能说哪个好那个不好。就像 tomcat 内存方面的配置,如果内存设置的过大,gc 垃圾回收机制就会变慢;如果内存设置的过小,tomcat又会出现内存溢出的情况,所以设置在一个合适的范围很重要,不仅不会出错,并且gc回收频繁使性能达到一个最优的结果。当然,这也需要根据不同的场合进行不同的测试才能产生最优的结果!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat java ee 服务器