tomcat线程优化
tomcat线程优化
===================================
tomcat线程池
在tomcat服务中每一个用户请求都是一个线程,所以可以使用线程池来提高性能。
1、线程池是什么?
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后创建线程后自动启动这些任务,线程池线程都是后台线程。每个线程都使用默认的堆栈大小。
它由线程池管理器,工作线程,任务接口,任务队列组成。
2、在什么情况下使用线程池?。
单个任务处理的时间短。将需处理的任务的数量大。
3、有什么好处?
【1】减少在创建和销毁线程所花的时间以及系统资源的开锁
【2】城小在用线程范、有可能址成系统创建大量线程而导数消耗宏系统内存以及“过度切换”。
===================================
参数说明
maxThreads(最大线程数):默认值是200(可适当调整)如果配置了一个。Executor,则该属性的任何值集将被正确记录,但是它将被显示为-1。
minSpareThreads(最小活跃线程数):默认是25(调整活跃线程数的时候必须开启下面的参数)。
prestartminSpareThreads(是否在启动时就生成minSpareThreads个线程):默认是flase,改为true则开启
MaxQueueSize(最大的等待队列数,超过则请求拒绝):基本是无 上限,假如你超过最大线程数,就可以给你设置100的等待队列数。
====================================
配置过程如下:
[root@localhost ~]# vim /usr/local/tomcat8/conf/tomcat-users.xml
44 <role rolename="manager-gui"/>
45 <role rolrname="admin-gui"/>
46 <user username="tomcat" password="tomcat" roles="m anager-gui,admin-gui"/>
保存退出
[root@localhost ~]# vim /usr/local/tomcat8/webapps/manager/META-INF/context.xml #注释以下内容
19 <!-- <Valve className="org.apache.catalina.valves .RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
保存退出
再重启服务
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
69 <Connector port="8080" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443"
72 maxThreads="500"
73 minSpareThreads="100"
74 prestartminSpareThreads="ture"
75 />
保存退出
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
tomcat连接器
Connector是Tomcat接收请求的入口,每个Connector有说自己专属的监听端口。
Connector有两种:HTTP Connector和AIP Connectors
-------------通用属性----------------
属性
allowTracee :一个布尔值,可用于启用或禁用TRACE HTTP方法。如果未指定,则此属性设置为false。
async Timeoute:异步请求的默认超时(以毫秒为单位)。如果未指定,则此属性设置为10000 (10 秒)。
enableLookups:设置为true,如果你想调用request.getRemoteHost(),以便返回远程客户的实际主机名执行DNS查找。
设置为false跳过DNS查找并以字符串形式返回IP地址(从而提高性能)。默认情况下,DNS 查找被禁用。
maxHeaderCounte:容器允许的请求中的最大标头数。将拒绝包含多于指定限制的标头的请求。值小于0表示没有限制。如果未指定,则使用默认值100。
maxParameterCounte:容器将自动解析的参数和值对的最大数量(GET 加POST)。超出此限制的参数和值对将被忽略。值小于0表示没有限制。
如果未指定,则使用默认值10000。请注意,FailedRequestFilter 过滤器可用于拒绝达到限制的请求
URIEncoding:解决乱码问题的
ccceptCount:当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。队列已满时收到的任何请求都将被拒绝。默认值为100。
acceptorThreadCounte:用于接受连接的线程数。在多CPU机器上增加此值,尽管您真的不需要超过2。此外,对于大量非保持连接的连接,您可能还希望增加此值。默认值是1。
compression:是否进行压缩
一个完整的模式
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
69 <Connector port="8080" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443"
72 maxThreads="500"
73 minSpareThreads="100"
74 prestartminSpareThreads="ture"
75 enableLookups="false"
76 maxPostSize="10485760"
77 URIEncoding="UTF-8"
78 acceptCount="100"
79 acceptorThreadCount="2"
80 disableUploadTimeout="True"
81 maxConnections="10000"
82 SSLEnabled="False"
83 />
保存退出
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
===========================================
禁用Tomcat AJP 连接器
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
129 <!--
130 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
保存退出
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
============================================
tomcat 热部署与热加载
面试题:什么是热部署,什么是热加载
项目开发过程中,经常要改动tomcat的jsp文件,但是又不想重新启动服务,因为服务器重新启动服务需要花费很长时间,
但又想直接获得deuge结果,有两种方式:热部署和热加载。
热加载:在server.xml > context属性中设置reladable= "true"
<Context docBase="/web/crushlinux" path="" reloadable="true" />.
#Context 用来指定网页存放位置
热部署:在server.xml -> context属性中设置 autoDeploy="true"
<Context docBase="/web/crushlinux" path="" autoDeploy="true" />
两者区别:
热加载:服务器会监听class文件改变,包括web-inf/class,web-inf/lib,web-inf/web.xml等文件,若发生更改,则局部进行加载,不清空session,不释放内存。开发中用的多,但是要考虑内存溢出的情况。
热部署: 整个项目重新部署,包括你重新打上.war文件。会清空session,释放内存。项目打包的时候用的多。
============================================
tomcat JVM 参数优化
适当调整tomcat的运行jvm参数可以提升整体性能
JVM内存模型
1. Java栈
Java栈与每一个线程关联的,jvm 在创建每个线程的时候,会分配一定的栈空间给线程使用,它主要用来存储线程执行过程中的局部变量和方法的返回值,以及方法调用上下文,栈空间随着线程的终止而释放
2. Java堆
Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种java对象,比如数组,线程对象等
3、Java堆的分区。
新生代 、老年代 、永久代
4、Virtual区:最大内存和初始内存的差值,就是vrtual区,新生代,老年代,永久代上都有虚拟区(virtual)。
5、设置区的大小
Jvm提供了相应的参数来对内存大小进行配置,jvm 中堆被分为了3个大的区间,同时jvm也提供了些选项对 young, oldgenerati on的大小进行控制。
6、Total heap.
Xms:指定了jvm初始启动以后初始化内存
-Xmx: 指定jvm堆的最大内存,在jvm启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全都使用,jvm会根据-Xms参数来调节真正用于jvm的内存。
Xmx-Xms=virtual大小(之差就是三个virtual空间大小)。
----------------------------------------------------------------------------
参数说明:。
1. file. encoding默认文件编码。
{
2. - Xmx1024m设置JVM最大可用内存为102 4MB.
3. -Xms1024m 设置JVM最小内存为1024 MB,此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
4. - XX:NewSize设置 新生代
5. XX: MaxNewSize 设置最大的新生代大小
6.-XX:PermSize 设置永久代大小
7. - XX :MaxPermSize设置最大永久代大小
}重要
8. - XX:NewRatio=4:设置新生代(包括Eden和两个Survivor区)与终身代的比值(除去永
久代)。设置为4,则新生代与终身代所占比值为1: 4,新生代占整个堆栈的1/50
9.- XXx:MaxTenuringThreshold=0:设置垃圾最大年龄, 默认为15,如果设置为0的话,则新生代对象不经过Survivor区,直接进去老年代,
对于老年代比较多的应用,可以提高效率。如果将此值设置为-一个较大值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象再新生代的存活时间,增加再新生代即被回收的概论。
10. - XX:+DisableExplicitGC这个将 会忽略手动调用GC的代码使得System. gc()的调用就会变成一一个空调用,完全不会出发任何GC。
====================================================
在tomcat中设置JVM参数
Tomcat性能取决于内存大小
上策: 优化代码,该项需要开发经验足够丰富,对开发人员要求较高。
中策: jvm 优化机制垃圾回收机制把不需要的内存回收。优化jvm--优化垃圾回收策略
下策:加足够大的内存,该项的资金投入比较大
下下策:每天0点定时重启tomcat ,使用较为广泛
优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:# tomcat分配1G内存模板。
上传meminfo.war 能够在网页中查看信息http://192.168.200.67:8080/meminfo/meminfo.jsp
[root@localhost ~]# vim /usr/local/tomcat8/bin/catalina.sh
2 JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
保存退出
### -Xms1024m -Xmx1024m 最小内存,最大内存
####-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
###########分别为设置新生代 设置永久代大小 设置最大永久代大小