赞
踩
全文章节
本文目录
2、tomcat 有哪几种Connector 运行模式(优化)?
4、tomcat容器是如何创建servlet类实例?用到了什么原理?
默认端口为8080,可以通过在tomcat安装包conf目录下,service.xml中的Connector元素的port 属性来修改端口。
这三种模式的不同之处如下:
BIO :一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7版本或更低 版本中,在Linux系统中默认使用这种方式。
NIO :利用Java的异步IO处理,可以通过少量的线程处理大量的请求。tomcat8.0.x中默认使用的是 NIO。Tomcat7必须修改Connector配置来启动:
<Connector port="8080" protocol="ong.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="2000e" redirectPort="8443"/>
APR :即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7或Tomcat8在 Win7或以上的系统中启动默认使用这种方式。
1. 当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件 进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候也是在第一次请求时实例化)
2. 在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求 实例化。
tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:
去掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。
利用缓存和压缩
采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性 能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工 作。可以参考之前写的《利用nginx+tomcat+memcached组建web服务器负载均衡》。
优化线程数优化
找到Connector port="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount属性(使 acceptCount大于等于maxThreads),如下:
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="2000e"
redirectPort="8443"acceptCount="50o" maxThreads="400"/>
其中:
- maxThreads:tomcat可用于请求处理的最大线程数,默认是200
- minSpareThreads:tomcat初始线程数,即最小空闲线程数
- maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
- acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过 这个数的请求将不予处理.默认100
使用线程池优化
在server.xml中增加executor节点,然后配置connector的executor属性,如下:
<Executor name="tomcatThreadPool"namePrefix="req-exec-"maxThreads="1000"
minSpareThreads="50"maxIdleTime="6088o" / >
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool" />
其中:
namePrefix:线程池中线程的命名前缀
- maxThreads:线程池的最大线程数
- minSpareThreads:线程池的最小空闲线程数
- maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
- threadPriority:线程优先级
注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报 java.net.SocketException:Too many open files错误。可使用下面步骤检查:
- ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001
- lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数
- 使用命令:ulimit -a 查看每个用户允许打开的最大文件数
启动速度优化
内存优化
因为tomcat启动起来后就是一个java进程,所以这块可以参照JVM部分的优化思路。堆内存相关参 数,比如说:
- -Xms:虚拟机初始化时的最小堆内存。
- -Xmx:虚拟机可使用的最大堆内存。-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性 能大起大落
- -XX:MaxNewSize:新生代占整个堆内存的最大值。
另外还有方法区参数调整(注意:JDK版本)、垃圾收集器等优化。JVM相关参数请看: 手把手教你设置JVM调优参数
Tomcat 服务器Apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的Web 应用服 务器(Servlet容器),属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被 普遍使用,是开发和调试JSP 程序的首选。
Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂 商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servlet中的 HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse 返回给客户端的过程。
从 Jar 包上来说,Servlet 规范就是两个 Jar 文件。servlet-api.jar 和 jsp-api.jar,Jsp 也是一种 Servlet。
从package上来说,就是 javax.servlet 和 javax.servlet.http 两个包。
从接口来说,就是规范了 Servlet 接口、Filter 接口、Listener 接口、ServletRequest 接口、 ServletResponse 接口等。类图如下:
我们用一张图来表示他们之间的关系:
简单的理解:启动一个ServerSocket,监听8080端口。Servlet容器用来装我们开发的Servlet。
假设来我们在浏览器上输入 http://localhost:8080/my-web-mave/index.jsp
在tomcat中是如何处理这个请求流程的:
1. 我们的请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得。
2. Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 。
3. Engine获得请求localhost/my-web-maven/index.jsp,匹配它所拥有的所有虚拟主机Host , 我们的虚拟主机在server.xml中默认配置的就是localhost。
4. Engine匹配到name=localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host 被定义为该Engine的默认主机)。
5. localhost Host获得请求/my-web-maven/index.jsp,匹配它所拥有的所有Context。
6. Host匹配到路径为/my-web-maven的Context(如果匹配不到就把该请求交给路径名为”"的 Context去处理)。
7. path=”/my-web-maven”的Context获得请求/index.jsp,在它的mapping table中寻找对应的 servlet 。
8. Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类。
9. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet 或doPost方法 。
10. Context把执行完了之后的HttpServletResponse对象返回给Host 。 11. Host把HttpServletResponse对象返回给Engine 。
12. Engine把HttpServletResponse对象返回给Connector 。
13. Connector把HttpServletResponse对象返回给客户browser 。
bin
启动,关闭和其他脚本。这些 .sh文件(对于Unix系统)是这些.bat文件的功能副本(对于 Windows系统)。由于Win32命令行缺少某些功能,因此此处包含一些其他文件。
比如说:windows下启动tomcat用的是startup.bat,另外Linux环境中使用的是startup.sh。对应 还有相应的shutdown关闭脚本。
conf
tomcat的配置文件和相关的DTD。这里最重要的文件是server.xml。它是容器的主要配置文件。
catalina.policy :tomcat:安全策略文件,控制JVM相关权限,具体可以参考 java.security.Permission。
catalina.properties :tomcat Catalina 行为控制配置文件,比如:Common ClassLoader。
logging.properties :tomcat日志配置文件。里面的日志采用的是JDK Logging。
server.xml :tomcat server配置文件(对于我开发人员来说是非常重要)。
context.xml :全局context配置文件,监视并加载资源文件,当监视的文件发生发生变化时,自 动加载 。
tomcat-user.xml :tomcat角色配置文件。
web.xml :Servlet标准的web.xml部署文件,tomcat默认实现部分配置 入内:
logs
日志文件默认位于此处。
localhost 有用,当你们的tomcat启动不了的时候,多看这个文件。比如:
access 最没用。
catalina.{date} 主要是控制台输出,全部日志都在这里面。
webapps
这是您的webapp所在的位置。其实这里面这几个都是一个项目。
简化web部署的方式。在线上环境中我们的应用是不会放在这里的。最好的办法就是外置。
lib
tomcat存放共用的类库。
比如: ecj-4.17.jar: eclipse Java编译器 jasper.jar:JSP编译器。
work
存放tomcat运行时编译后的文件,比如JSP编译后的文件 。
temp
存放运行时产生的临时文件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。