vlambda博客
学习文章列表

带大家一起深入Tomcat容器架构剖析

一、web容器简介


1
     概念       

1)服务器:安装了服务器软件的计算机

2)服务器软件:接收用户的请求,处理请求,做出响应

3)web服务器软件:在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目

2
常见Web服务器软件

1) webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

2) webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

3) JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

4) Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。


二、HTTP协议必知必会
1
HTTP 和 HTML 有什么区别?

HTTP是协议规范HTML是超文本标记语言用来规范显示格式。

2
  http工作原理  


带大家一起深入Tomcat容器架构剖析

3
   http协议   

带大家一起深入Tomcat容器架构剖析

带大家一起深入Tomcat容器架构剖析

带大家一起深入Tomcat容器架构剖析


三、Tomcat系统架构


1
Tomcat总体架构

带大家一起深入Tomcat容器架构剖析

Tomcat 的2 个核心功能:

1) 处理Socket 连接,负责网络字节流与Request 和Response 对象的转化。

加载和管理Servlet,以及具体处理Request 请求。

2) Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。

2
  连接器  

带大家一起深入Tomcat容器架构剖析

我们可以把连接器的功能需求进一步细化,比如:

监听网络端口。

接受网络连接请求。

读取请求网络字节流。

根据具体应用层协议(HTTP/AJP)解析字节流,生成统一的Tomcat Request对象。

将Tomcat Request对象转成标准的ServletRequest。

调用Servlet 容器,得到ServletResponse。

将ServletResponse转成TomcatResponse 对象。

将TomcatResponse 转成网络字节流。

将响应字节流写回给浏览器


---->综上得到三个高内聚的功能

1.网络通信。

2.应用层协议解析。

3.Tomcat Request/Response与ServletRequest/ServletResponse的转化

3
   容器   

带大家一起深入Tomcat容器架构剖析

带大家一起深入Tomcat容器架构剖析

4
tomcat打破双亲委派加载机制

带大家一起深入Tomcat容器架构剖析

带大家一起深入Tomcat容器架构剖析

5
Tomcat类加载器的层次结构

带大家一起深入Tomcat容器架构剖析

6
请求定位Servlet的过程

带大家一起深入Tomcat容器架构剖析


1)首先,根据协议和端口号选定Service 和Engine

2)然后,根据域名选定Host

3)之后,根据URL 路径找到Context 组件

4)最后,根据URL 路径找到Wrapper(Servlet)


四、性能优化
  • 清理你的tomcat

  • 清理不必要的Web应用

  • 清理XML配置文件

  • 清理JAR文件(web lib目录不应该出现servlet或者tomcat自身的jar包 <scope>provided</scope>)

  • 清理其他文件(比如log日志,work目录下的class)

  • 禁止 Tomcat TLD 扫描  

  • 关闭 WebSocket 支持

  • 关闭 JSP 支持

  • 禁止 Servlet 注解扫描

  • 并行启动多个 Web 应用


CMSvs G1,G1的两大特点:

(1)G1可以并发完成大部分GC的工作,这期间不会“Stop-The-World”。

(2)G1使用非连续空间,这使G1 能够有效地处理非常大的堆。此外,G1可以同时收集年轻代和年老代。G1并没有将Java堆分成三个空间(Eden、Survivor和Old),而是将堆分成许多(通常是几百个)非常小的区域。这些区域是固定大小的(默认情况下大约为2MB)。每个区域都分配给一个空间。G1 收集器的Java 堆如下图所示


问题:

1.什么是内存泄漏

2.什么是内存溢出(java.lang.OutOfMemoryError:Java heap space)

1)内存泄漏

2)配置问题

3)过度使用finalize


gc问题的分析与解决

1. 使用jstat命令观察gc的过程

2. 通过GCViewer 工具查看GC 日志,用GCViewer 打开程序指定输出的gc.log,会看到这样的图:

带大家一起深入Tomcat容器架构剖析

3. 为了找到内存泄漏点,我们通过jmap 工具生成Heap Dump:

jmap -dump:live,format=b,file=94223.bin94223

4. 用Eclipse MemoryAnalyzer 打开Dump文件,通过内存泄漏分析,得到这样一个分析报告:

带大家一起深入Tomcat容器架构剖析

从报告中可以看到,JVM内存中有一个长度为4000 万的List,至此我们也就找到了泄漏点。


END