tomcat線程優化
===================================
tomcat線程池
在tomcat服務中每個用戶請求都是一個線程,因此可使用線程池來提升性能。
一、線程池是什麼?
線程池是一種多線程處理形式,處理過程當中將任務添加到隊列,而後建立線程後自動啓動這些任務,線程池線程都是後臺線程。每一個線程都使用默認的堆棧大小。
它由線程池管理器,工做線程,任務接口,任務隊列組成。
二、在什麼狀況下使用線程池?。
單個任務處理的時間短。將需處理的任務的數量大。
三、有什麼好處?
【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.shjava
![](http://static.javashuo.com/static/loading.gif)
===========================================
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對象,好比數組,線程對象等
三、Java堆的分區。
新生代 、老年代 、永久代
四、Virtual區:最大內存和初始內存的差值,就是vrtual區,新生代,老年代,永久代上都有虛擬區(virtual)。
五、設置區的大小
Jvm提供了相應的參數來對內存大小進行配置,jvm 中堆被分爲了3個大的區間,同時jvm也提供了些選項對 young, oldgenerati on的大小進行控制。
六、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"
###########分別爲設置新生代 設置永久代大小 設置最大永久代大小
![](http://static.javashuo.com/static/loading.gif)