带你读《Apache Tomcat的云原生演进》——Tomcat的技术内幕和在喜马拉雅的实践(5)https://developer.aliyun.com/article/1377538
Tomcat针对线程做了比较好的优化,它用了对象池的技术,包括Socket Channel。Socket建连它会有很多servlet Channel,因为它会做一些对象池来缓存eventCaches,eventCaches是NIO里面的。SocketProcessor有事件读的话,就提交给Catalina work线程,提交的test都是缓存的,通用的。SocketProcessor提交现在运行里面,他真的去解析请求行或者请求头,它这里又是通用的,又是找了Processor,它也是做缓存用的,尽可能减少应用对象的开销。
Processor和Socket Channel不一样,它缓存的速度和容量是有大小限制的,像Request Processor它的初始大小是200,但它的limit是-1,即没有限制的。因为你放回去它就会膨胀,膨胀就会有-1,没有限制就会一直膨胀。如果并发压测就会导致比如200-5000个并发压,都膨胀就都全部缓存起来了。
因为它这个东西还会做Object监控,把它全部放在global把它统计出来,就会导致只要送回去,就不会把清理,所以这里面就会有很多。因为Processor还会把Request、Pods都缓存在这里,这个时候你会发现这些东西基本都已经处理完请求了,但缓存里的单维还在这里,就是因为-1没有限制。
总结,本次分享就是这些,主要对Tomcat的网络io,线程模型,内存模型,类加载机器,以及对像池技术做了一个介绍,欢迎交流讨论。