`
uule
  • 浏览: 6348571 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

tomcat的三种运行模式+JAVA NIO

 
阅读更多

详解Tomcat三种运行模式(BIO, NIO, APR)的比较和场景分析

 

Java NIO:Buffer、Channel 和 Selector (重要)

Java 非阻塞 IO 和异步 IO (重要)

 

 


 

 

NIO 方式:



 
 

Tomcat8.0起已经默认nio模式,不需要做修改,BIO模式也已经抛弃了,今天主要介绍下tomcat的三种运行模式:BIO、NIO、ARP。

 

TOMCAT BIO、NIO、AIO适用场景分析:

 

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于【连接数目多且连接比较短】(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式使用于【连接数目多且连接比较长】(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

 

这三种模式的不同之处如下:

BIO:

【一个线程处理一个请求】。

缺点:【并发量高时,线程数较多,浪费资源】。

Tomcat7或以下,在Linux系统中默认使用这种方式。

 

NIO:

【利用Java的异步IO处理】,可以通过【少量的线程处理大量的请求】。

Tomcat8在Linux系统中默认使用这种方式。

 

APR:

即Apache Portable Runtime,从操作系统层面解决io阻塞问题。

Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。

 

=============================================================

NIO是什么?适用于何种场景?

NIO模型,select/epoll的区别,多路复用的原理

原生的 NIO 在 JDK 1.7 版本存在 epoll bug

 

 

JAVA BIO:

来一个新的连接,我们就新开一个线程来处理这个连接,之后的操作全部由那个线程来完成。

 

那么,这个模式下的性能瓶颈在哪里呢?

 

首先,每次来一个连接都开一个新的线程这肯定是不合适的。当活跃连接数在几十几百的时候当然是可以这样做的,但如果活跃连接数是几万几十万的时候,这么多线程明显就不行了。

【每个线程都需要一部分内存,内存会被迅速消耗】,同时,【线程切换的开销也非常大】

 

其次,阻塞操作在这里也是一个问题。首先,【accept() 是一个阻塞操作,当 accept() 返回的时候,代表有一个连接可以使用了】,我们这里是马上就新建线程来处理这个 SocketChannel 了,

但是,【但是这里不代表对方就将数据传输过来了】。所以,SocketChannel#read 方法将阻塞,等待数据,明显这个等待是不值得的。

同理,write 方法也需要等待通道可写才能执行写入操作,这边的阻塞等待也是不值得的。

 

JAVA NIO:

非阻塞 IO 的核心在于【使用一个 Selector 来管理多个通道】,可以是 SocketChannel,也可以是 ServerSocketChannel,【将各个通道注册到 Selector上,指定监听的事件】

之后可以【只用一个线程来轮询这个 Selector,看看上面是否有通道是准备好的】,当通道准备好可读或可写,然后才去开始真正的读写,这样速度就很快了。我们就完全没有必要给每个通道都起一个线程。

 

 

Channel

所有的 NIO 操作始于通道,通道是数据来源或数据写入的目的地,主要地,我们将关心 java.nio 包中实现的以下几个 Channel:

FileChannel:文件通道,用于文件的读和写,FileChannel 不支持非阻塞

DatagramChannel:用于 UDP 连接的接收和发送

SocketChannel:把它理解为 TCP 连接通道,简单理解就是 TCP 客户端

ServerSocketChannel:TCP 对应的服务端,用于监听某个端口进来的请求

 

Selector

NIO 三大组件就剩 Selector 了,【Selector 建立在非阻塞的基础之上】,大家经常听到的 【多路复用】 在 Java 世界中指的就是它,【用于实现一个线程管理多个 Channel】

 

 

select:上世纪 80 年代就实现了,它支持注册 FD_SETSIZE(1024) 个 socket,在那个年代肯定是够用的,不过现在嘛,肯定是不行了。

poll:1997 年,出现了 poll 作为 select 的替代者,最大的区别就是,【poll 不再限制 socket 数量】

 

【select 和 poll 都有一个共同的问题,那就是它们都只会告诉你有几个通道准备好了,但是不会告诉你具体是哪几个通道】。所以,【一旦知道有通道准备好以后,自己还是需要进行一次扫描】,显然这个不太好,通道少的时候还行,一旦通道的数量是几十万个以上的时候,扫描一次的时间都很可观了,时间复杂度 O(n)。所以,后来才催生了以下实现。

 

epoll:2002 年随 Linux 内核 2.5.44 发布,【epoll 能直接返回具体的准备好的通道】,时间复杂度 O(1)。

 

 

下面对 Java 异步 IO 进行实践性的介绍。

总共有三个类需要我们关注,分别是 AsynchronousSocketChannel,AsynchronousServerSocketChannel 和 AsynchronousFileChannel,只不过是在之前介绍的 FileChannel、SocketChannel 和 ServerSocketChannel 的类名上加了个前缀 Asynchronous。

 

 

Java 异步 IO 提供了两种使用方式,分别是返回 Future 实例和使用回调函数。

 

  • 大小: 20.1 KB
  • 大小: 21 KB
分享到:
评论

相关推荐

    浅谈Tomcat三种运行模式

    Tomcat服务器有三种运行模式:bio、nio和apr。每种模式都有其特点和优缺点,本文将对这三种模式进行详细的介绍。 bio模式 bio模式是Tomcat服务器的传统运行模式,也是Tomcat 7以下版本的默认运行模式。bio模式使用...

    tomcat的运行模式

    在本文中,我们将详细介绍Tomcat的三种主要运行模式:BIO(Blocking I/O)、NIO(Non-blocking I/O)和 APR(Apache Portable Runtime),并探讨它们的配置方法。 #### 1. BIO (Blocking I/O) BIO 模式是最传统的I...

    java-instantcode-developing.rar_java nio

    Java NIO(New IO)是Java平台中的一种IO模型,全称为“非阻塞I/O”。它是Java 1.4引入的新特性,替代了传统的Java IO API,为开发者提供了更高效、灵活的输入输出操作方式。Java NIO的核心组件包括通道(Channel)...

    tomcat8.5.56_X64_nio2模式性能优化版+垃圾处理机制.zip

    【标题】:“Tomcat 8.5.56 X64 NIO2模式性能优化版+垃圾处理机制.zip”指的是一个特别针对Windows x64平台优化的Tomcat 8.5.56版本,该版本集成了NIO2(非阻塞I/O)模式,并对垃圾收集(Garbage Collection, GC)...

    Java NIO通信框架在电信领域的实践.docx

    Java NIO的核心特性包括通道(Channels)和缓冲区(Buffers),它们提供了一种非阻塞的数据读写方式,减少了线程等待I/O操作的时间。此外,选择器(Selectors)允许单个线程管理多个通道,提高了服务器的并发处理...

    10.3Tomcat三种工作模式介绍.txt

    根据提供的文件信息,本文将详细介绍Tomcat服务器的三种工作模式:BIO(Blocking I/O)、NIO(Non-blocking I/O)以及AIO(Asynchronous I/O),并简要提及APR(Apache Portable Runtime)的工作原理及其与Tomcat的...

    Tomcat与Java Web开发技术详解

    - **Tomcat简介**:Tomcat是一款开源的Java Servlet容器,主要用于运行Java Web应用程序,支持Servlet和JSP标准。 - **安装与配置**:书中详细介绍了Tomcat的下载、安装步骤,以及配置文件如`server.xml`和`web....

    【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!

    Tomcat运行模式 Tomcat的运行模式有3种。 1.bio模式 默认的模式,性能非常低下,没有经过任何优化处理和支持。 2.nio模式 利用java的异步io护理技术,noblocking IO技术。要想运行在该模式下,则直接修改server.xml里的...

    Tomcat_系统架构与模式设计分析.doc

    Tomcat,作为一款广泛应用的Java Servlet容器,其系统架构和模式设计对于理解其高效稳定运行至关重要。本文将深入探讨Tomcat的核心组件、结构以及关键设计模式。 首先,Tomcat的总体结构可概括为四个主要组件:...

    tomcat6.0 适用与java web 程序的开发服务器

    Tomcat 6.0是一款广泛应用的开源Java Web服务器,由Apache软件基金会维护,它实现了Java Servlet和JavaServer Pages(JSP)规范,为Java Web应用程序提供了一个轻量级且高效的运行环境。在Java Web开发领域,Tomcat...

    JAVA_Tomcat面试专题14道.pdf

    Tomcat的Connector有bio、nio、aio和apr四种运行模式: 1. bio:传统的Java I/O操作,同步且阻塞IO。 2. nio:JDK1.4开始支持,同步阻塞或同步非阻塞IO。 3. aio(nio.2):JDK7开始支持,异步非阻塞IO。 4. apr:...

    Tomcat7.0(源码+jar包)

    2. **NIO连接器**:除了传统的BIO连接器,Tomcat7.0还支持非阻塞I/O(NIO)模式,这使得在高并发环境下表现更优。 3. **改进的部署功能**:允许用户通过简单的XML文件或web应用的目录结构来部署应用,也支持热部署...

    Tomcat面试题 14道.pdf

    Tomcat 的 Connector 运行模式有多种,包括 bio、nio、aio、apr 等。其中,bio 是传统的 Java I/O 操作,同步且阻塞 IO。nio 是 JDK 1.4 开始支持的同步阻塞或同步非阻塞 IO。aio 是 JDK 7 开始支持的异步非阻塞 IO...

    使用Java_NIO编写高性能的服务器.doc

    ### 使用Java NIO编写高性能服务器的关键知识点 #### 一、NIO概述 - **NIO简介**:NIO(New IO)自JDK 1.4引入以来,为Java提供了非阻塞IO的支持,这对于提高服务端应用的性能至关重要。NIO的核心特性包括缓冲区...

    tomcat7和8

    Apache Tomcat是一款开源的Java Servlet容器,用于部署和运行Java Web应用程序。它是基于Sun Microsystems的Java Servlet和JavaServer Pages(JSP)技术的。Tomcat是Apache软件基金会Jakarta项目的一部分,以其轻量...

    Java Tomcat面试题

    Tomcat有三种Connector运行模式: 1. BIO:同步并阻塞一个线程处理一个请求,缺点是并发量高时,线程数较多,浪费资源。 2. NIO:同步非阻塞IO利用Java的异步IO处理,可以通过少量的线程处理大量的请求,可以复用同...

    tomcat apr模式所需资源包

    Apache Tomcat是一款广泛应用的开源Java Servlet容器,它用于部署和运行Java Web应用程序。在Tomcat 7及以上版本中,引入了APR (Apache Portable Runtime) 模式,以提高其性能,尤其是对于高并发场景。APR模式利用...

    服务器Tomcat面试题

    Tomcat 有三种 Connector 运行模式: * bio:传统的 Java I/O 操作,同步且阻塞 IO。 * nio:JDK1.4 开始支持,同步阻塞或同步非阻塞 IO。 * aio (nio.2):JDK7 开始支持,异步非阻塞 IO。 * apr:Tomcat 将以 JNI ...

    tomcat8和tomcat7

    Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,是一个开源的Servlet容器,主要用于部署Java Servlet和JavaServer Pages(JSP)应用。Tomcat7和Tomcat8是两个不同版本的Tomcat,它们在功能、性能和安全性...

    tomcat性能优化.pdf

    Tomcat支持三种运行模式:bio、nio、apr,根据应用场景选择最适合的运行模式也很关键。 部署测试用的Java Web项目是验证Tomcat配置是否合理的重要步骤。部署web应用后,通过访问首页确认是否已成功启动,这是最基本...

Global site tag (gtag.js) - Google Analytics