1.Tomcat 支持四种线程模型介绍
什么是IO?
IO是指为数据传输所提供的输入输出流,其输入输出对象可以是:文件、网络服务、内存等。
提问:
假设应用在从硬盘中读取一个大文件过程中,此时CPU会与硬盘一样出于高负荷状态么?
演示:
演示观察大文件的读写过程当中CPU 有没有发生大波动。
演示结果:CPU 没有太高的增涨
通常情况下IO操作是比较耗时的,所以为了高效的使用硬件,应用程序可以用一个专门线程进行IO操作,而另外一个线程则利用CPU的空闲去做其它计算。这种为提高应用执行效率而采用的IO操作方法即为IO模型。
使用指定IO模型的配置方式:
配置 server.xml 文件当中的 <Connector protocol="HTTP/1.1"> 修改即可。
默认配置 8.0 protocol=“HTTP/1.1” 8.0 之前是 BIO 8.0 之后是NIO
BIO
protocol=“org.apache.coyote.http11.Http11Protocol“
NIO
protocol=”org.apache.coyote.http11.Http11NioProtocol“
AIO
protocol=”org.apache.coyote.http11.Http11Nio2Protocol“
APR
protocol=”org.apache.coyote.http11.Http11AprProtocol“
2.Tomcat BIO、NIO实现过程源码解析
BIO 与NIO有什么区别?
分别演示在高并发场景下BIO与NIO的线程数的变化?
演示数据:
1、网络
2、程序执行业务用时
BIO 线程模型讲解
NIO 线程模型讲解
BIO 源码解读
线程组:
Accept 线程组 acceptorThreadCount=
exec 线程组 maxThread
JIoEndpoint
Acceptor extends Runnable
SocketProcessor extends Runnable
BIO
线程数量 会受到 客户端阻塞、网络延迟、业务处理慢===>线程数会更多
NIO
线程数量 会受到业务处理慢===>线程数会更多
NIO有了Poller处理连接,不断轮循读取select key,将读完的连接交给线程池处理逻辑,线程池处理完后返回Poller,Poller在进行写,写完后返回给浏览器,读有三个方法,select(),selectLong(),selectNow()
3.Tomcat connector 并发参数解读
4.Tomcat 类加载机制源码解析
类加载的本质
是用来加载 Class 的。它负责将 Class 的字节码形式转换成内存形式的 Class 对象。字节码可以来自于磁盘文件 *.class,也可以是 jar 包里的 *.class,也可以来自远程服务器提供的字节流,字节码的本质就是一个字节数组 []byte,它有特定的复杂的内部格式。
JVM 运行实例中会存在多个 ClassLoader,不同的 ClassLoader 会从不同的地方加载字节码文件。它可以从不同的文件目录加载,也可以从不同的 jar 文件中加载,也可以从网络上不同的静态文件服务器来下载字节码再加载。
jvm里ClassLoader的层次结构
Tomcat的 类加载顺序
在Tomcat中,默认的行为是先尝试在Bootstrap和Extension中进行类型加载,如果加载不到则在WebappClassLoader中进行加载,如果还是找不到则在Common中进行查找。。
NoClassDefFoundError
NoClassDefFoundError是在开发JavaEE程序中常见的一种问题。该问题会随着你所使用的JavaEE中间件环境的复杂度以及应用本身的体量变得更加复杂,尤其是现在的JavaEE服务器具有大量的类加载器。
在JavaDoc中对NoClassDefFoundError的产生是由于JVM或者类加载器实例尝试加载类型的定义,但是该定义却没有找到,影响了执行路径。换句话说,在编译时这个类是能够被找到的,但是在执行时却没有找到。
这一刻IDE是没有出错提醒的,但是在运行时却出现了错误。
NoSuchMethodError
在另一个场景中,我们可能遇到了另一个错误,也就是NoSuchMethodError。
NoSuchMethodError代表这个类型确实存在,但是一个不正确的版本被加载了。
ClassCastException
ClassCastException,在一个类加载器的情况下,一般出现这种错误都会是在转型操作时,比如:A a = (A) method();,很容易判断出来method()方法返回的类型不是类型A,但是在 JavaEE 多个类加载器的环境下就会出现一些难以定位的情况。