- 一鍵三連加關注,,,感謝 ! ! !

文章目錄
- 一. Tomcat的預設埠是多少,怎么修改?
- 二. Tomcat 有哪幾種Connector 運行模式(優化)?
- 三. Tomcat有幾種部署方式?
- 四. Tomcat容器是如何創建servlet類實體?用到了什么原理?
- 五. Tomcat 如何優化?
- 六. 記憶體調優
- 七. 垃圾回收策略調優
- 八. 共享session處理
- 九. 添加JMS遠程監控
- 十. 專業點的分析工具有
- 十一. 關于Tomcat的session數目
- 十二. 監視Tomcat的記憶體使用情況
- 十三. 列印類的加載情況及物件的回收情況
- 十四. Tomcat一個請求的完整程序
- 十五.Tomcat作業模式?
一. Tomcat的預設埠是多少,怎么修改?
- 找到Tomcat目錄下的conf檔案夾
- 進入conf檔案夾里面找到server.xml檔案
- 打開server.xml檔案
- 在server.xml檔案里面找到下列資訊
<!-- port="8080"改成你想要的埠 -->
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
二. Tomcat 有哪幾種Connector 運行模式(優化)?
- bio:傳統的Java I/O操作,同步且阻塞IO,
maxThreads="150"Tomcat使用執行緒來處理接收的每個請求,這個值表示Tomcat可創建的最大的執行緒數,默認值200,可以根據機器的時期性能和記憶體大小調整,一般可以在400-500,最大可以在800左右,minSpareThreads="25"Tomcat初始化時創建的執行緒數,默認值4,如果當前沒有空閑執行緒,且沒有超過maxThreads,一次性創建的空閑執行緒數量,Tomcat初始化時創建的執行緒數量也由此值設定,maxSpareThreads="75"一旦創建的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒,默認
值50,一旦創建的執行緒超過此數值,Tomcat會關閉不再需要的執行緒,執行緒數可以大致上用 “同時在線人數每秒用戶操作次數系統平均操作時間” 來計算,acceptCount="100"指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請
求數,超過這個數的請求將不予處理,默認值10,如果當前可用執行緒數為0,則將請求放入處理佇列中,這個值限定了請求佇列的大小,超過這個數值的請求將不予處理,connectionTimeout="20000"網路連接超時,默認值20000,單位:毫秒,設定為0表示永不超時,
這樣設定有隱患的,通常可設定為30000毫秒,
- nio:JDK1.4開始支持,同步阻塞或同步非阻塞IO,
指定使用NIO模型來接受HTTP請求
protocol="org.apache.coyote.http11.Http11NioProtocol"指定使用NIO模型來接受HTTP請求,默認是BlockingIO,配置為protocol="HTTP/1.1"acceptorThreadCount="2"使用NIO模型時接收執行緒的數目,
-
aio(nio.2):JDK7開始支持,異步非阻塞IO,
-
apr:Tomcat將以JNI的形式呼叫Apache HTTP服務器的核心元件來處理檔案讀取或網路傳輸操作,從而大大地 提高Tomcat對靜態檔案的處理性能,
<!-- protocol 啟用 nio模式,(tomcat8默認使用的是nio)(apr模式利用系統級異步io) -->
<!-- minProcessors最小空閑連接執行緒數-->
<!-- maxProcessors最大連接執行緒數-->
<!-- acceptCount允許的最大連接數,應大于等于maxProcessors-->
<!-- enableLookups 如果為true,requst.getRemoteHost會執行DNS查找,反向決議ip對應域名或主機名-->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="100"
maxSpareThreads="200"
acceptCount="200"
enableLookups="false"/>
- 其他配置
maxHttpHeaderSize="8192"http請求頭資訊的最大程度,超過此長度的部分不予處理,一般8K,
URIEncoding="UTF-8"指定Tomcat容器的URL編碼格式,
disableUploadTimeout="true"上傳時是否使用超時機制
enableLookups="false"是否反查域名,默認值為true,為了提高處理能力,應設定為false
compression="on"打開壓縮功能
compressionMinSize="10240"啟用壓縮的輸出內容大小,默認為2KB
noCompressionUserAgents="gozilla, traviata"對于以下的瀏覽器,不啟用壓縮
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"哪些資源型別需要壓縮
三. Tomcat有幾種部署方式?
- 直接把Web專案放在webapps下,Tomcat會自動將其部署
- 在server.xml檔案上配置
<Context>節點,設定相關的屬性即可 - 通過Catalina來進行配置:進入到conf\Catalina\localhost檔案下,創建一個xml檔案,該檔案的名字就是站點的名字,撰寫XML的方式來進行設定,
四. Tomcat容器是如何創建servlet類實體?用到了什么原理?
- 當容器啟動時,會讀取在webapps目錄下所有的web應用中的web.xml檔案,然后對xml檔案進行決議,并讀取servlet注冊資訊,然后,將每個應用中注冊的servlet類都進行加載,并通過反射的方式實體化,(有時候也是在第一次請求時實體化)在servlet注冊時加上如果為正數,則在一開始就實體化,如果不寫或為負數,則第一次請求實體化,
五. Tomcat 如何優化?
優化連接配置.這里以tomcat7的引數配置為例,需要修改conf/server.xml檔案,修改連接數,關閉客戶端dns查詢,
引數解釋:
URIEncoding=”UTF-8″:使得tomcat可以決議含有中文名的檔案的url,真方便,不像apache里還有搞個mod_encoding,還要手工編譯,maxSpareThreads: 如果空閑狀態的執行緒數多于設定的數目,則將這些執行緒中止,減少這個池中的執行緒總數,minSpareThreads: 最小備用執行緒數,tomcat啟動時的初始化的執行緒數,enableLookups: 這個功效和Apache中的HostnameLookups一樣,設為關閉,connectionTimeout : connectionTimeout為網路連接超時時間毫秒數,maxThreads : maxThreadsTomcat使用執行緒來處理接收的每個請求,這個值表示Tomcat可創建的最大的執行緒數,即最大并發數,acceptCount : acceptCount是當執行緒數達到maxThreads后,后續請求會被放入一個等待佇列,這個acceptCount是這個佇列的大小,如果這個佇列也滿了,就直接refuse connection,maxProcessors與minProcessors: 在 Java中執行緒是程式運行時的路徑,是在一個程式中與其它控制執行緒無關的、能夠獨立運行的代碼段,它們共享相同的地址空間,多執行緒幫助程式員寫出CPU最 大利用率的高效程式,使空閑時間保持最低,從而接受更多的請求,
通常Windows是1000個左右,Linux是2000個左右,
六. 記憶體調優
記憶體方式的設定是在catalina.sh中,調整一下JAVA_OPTS變數即可,因為后面的啟動引數會把 JAVA_OPTS作為JVM的啟動引數來處理,
具體設定如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4"
其各項引數如下:
-Xmx3550m:設定JVM最大可用記憶體為3550M,-Xms3550m:設定JVM促使記憶體為3550m,此值可以設定與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配記憶體,-Xmn2g:設定年輕代大小為2G,整個堆大小=年輕代大小 + 年老代大小 + 持久代大小,持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小,此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8,-Xss128k:設定每個執行緒的堆疊大小,JDK5.0以后每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K,更具應用的執行緒所需記憶體大小進行調整,在相同物理記憶體下,減小這個值能生成更多的執行緒,但是作業系統對一個行程內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右,-XX:NewRatio=4:設定年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代),設定為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆疊的1/5-XX:SurvivorRatio=4:設定年輕代中Eden區與Survivor區的大小比值,設定為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6-XX:MaxPermSize=16m:設定持久代大小為16m,-XX:MaxTenuringThreshold=0:設定垃圾最大年齡,如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代,對于年老代比較多的應用,可以提高效率,如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次復制,這樣可以增加物件再年輕代的存活時間,增加在年輕代即被回收的概論,
七. 垃圾回收策略調優
垃圾回收的設定也是在catalina.sh中,調整JAVA_OPTS變數,
具體設定如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis="100"
具體的垃圾回收策略及相應策略的各項引數如下:
- 串行收集器(JDK1.5以前主要的回收方式)
-XX:+UseSerialGC:設定串行收集器 - 并行收集器(吞吐量優先)
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
-XX:+UseParallelGC:選擇垃圾收集器為并行收集器,此配置僅對年輕代有效,即上述配置下,年輕代使用并發收集,而年老代仍舊使用串行收集-XX:ParallelGCThreads=20:配置并行收集器的執行緒數,即:同時多少個執行緒一起進行垃圾回收,此值最好配置與處理器數目相等,-XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集,JDK6.0支持對年老代并行收集-XX:MaxGCPauseMillis=100:設定每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值,-XX:+UseAdaptiveSizePolicy:設定此選項后,并行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用并行收集器時,一直打開,
- 并發收集器(回應時間優先)
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-XX:+UseConcMarkSweepGC:設定年老代為并發收集,測驗中配置這個以后,-XX:NewRatio=4的配置失效了,原因不明,所以,此時年輕代大小最好用-Xmn設定,-XX:+UseParNewGC: 設定年輕代為并行收集,可與CMS收集同時使用,JDK5.0以上,JVM會根據系統配置自行設定,所以無需再設定此值,-XX:CMSFullGCsBeforeCompaction:由于并發收集器不對記憶體空間進行壓縮、整理,所以運行一段時間以后會產生“碎片”,使得運行效率降低,此值設定運行多少次GC以后對記憶體空間進行壓縮、整理,-XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮,可能會影響性能,但是可以消除碎片,
八. 共享session處理
目前的處理方式有如下幾種:
- 使用Tomcat本身的Session復制功能,方案的有點是配置簡單,缺點是當集群數量較多時,Session復制的時間會比較長,影響回應的效率,
- 使用第三方來存放共享Session目前用的較多的是使用memcached來管理共享Session,借助于memcached-sesson-manager來進行Tomcat的Session管理,
- 使用黏性session的策略,對于會話要求不太強(不涉及到計費,失敗了允許重新請求下等)的場合,同一個用戶的session可以由nginx或者apache交給同一個Tomcat來處理,這就是所謂的session sticky策略,目前應用也比較多,
nginx默認不包含session sticky模塊,需要重新編譯才行(windows下我也不知道怎么重新編譯)優點是處理效率高多了,缺點是強會話要求的場合不合適,
九. 添加JMS遠程監控
對于部署在局域網內其它機器上的Tomcat,可以打開JMX監控埠,局域網其它機器就可以通過這個埠查看一些常用的引數(但一些比較復雜的功能不支持),同樣是在JVM啟動引數中配置即可,
配置如下:
-Dcom.sun.management.jmxremote.ssl=false -
Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.71.38 設定JVM的JMS監控監聽的IP地址,主要是為了防止錯誤的監聽成127.0.0.1這個內網地址
-Dcom.sun.management.jmxremote.port=1090 設定JVM的JMS監控的埠
-Dcom.sun.management.jmxremote.ssl=false 設定JVM的JMS監控不實用SSL
-Dcom.sun.management.jmxremote.authenticate=false 設定JVM的JMS監控不需要認證
十. 專業點的分析工具有
- IBM ISA,JProfiler、probe 等,具體監控及分析方式去網上搜索即可
十一. 關于Tomcat的session數目
- 這個可以直接從Tomcat的web管理界面去查看即可 ;
- 或者借助于第三方工具Lambda Probe來查看,它相對于Tomcat自帶的管理稍微多了點功能,但也不多 ;
十二. 監視Tomcat的記憶體使用情況
- 使用JDK自帶的jconsole可以比較明了的看到記憶體的使用情況,執行緒的狀態,當前加載的類的總量等;
- JDK自帶的jvisualvm可以下載插件(如GC等),可以查看更豐富的資訊,
- 如果是分析本地的Tomcat的話,還可以進行記憶體抽樣等,檢查每個類的使用情況,
十三. 列印類的加載情況及物件的回收情況
這個可以通過配置JVM的啟動引數,列印這些資訊(到螢屏(默認也會到catalina.log中)或者檔案),
具體引數如下:
-
-XX:+PrintGC:
輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC121376K->10414K(130112K), 0.0650971 secs] -
-XX:+PrintGCDetails:輸出形式:
[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs]118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K),
0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K-10414K(130112K), 0.0436268 secs] -
-XX:+PrintGCTimeStamps -
-XX:+PrintGC:PrintGCTimeStamps可與上面兩個混合使用,
輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] -
-XX:+PrintGCApplicationConcurrentTime:列印每次垃圾回收前,程式未中斷的執行時間, 可與上面混合使用,
輸出形式:Application time: 0.5291524 seconds -
-XX:+PrintGCApplicationStoppedTime:列印垃圾回收期間程式暫停的時間,可與上面混合使用,
輸出形式:Total time for which application threads were stopped: 0.0468229 seconds -
-XX:PrintHeapAtGC: 列印GC前后的詳細堆疊資訊 -
-Xloggc:filename:與上面幾個配合使用,把相關日志資訊記錄到檔案以便分析 -
-verbose:class 監視加載的類的情況 -
-verbose:gc 在虛擬機發生記憶體回收時在輸出設備顯示資訊 -
-verbose:jni 輸出native方法呼叫的相關情況,一般用于診斷jni呼叫錯誤資訊
十四. Tomcat一個請求的完整程序
Ng:(nginx)
upstream yy_001{
server 10.99.99.99:8080;
server 10.99.99.100:8080;
hash $**;
healthcheck_enabled;
healthcheck_delay 3000;
healthcheck_timeout 1000;
healthcheck_failcount 2;
healthcheck_send 'GET /healthcheck.html HTTP/1.0' 'Host: wo.com'
'Connection: close';
}
server {
include base.conf;
server_name wo.de.tian;
...
location /yy/ {
proxy_pass http://yy_001;
}
首先 dns 決議 wo.de.tian機器,一般是ng服務器ip地址,然后 ng根據server的配置,尋找路徑為 yy/的機器串列,ip和埠,最后 選擇其中一臺機器進行訪問,
下面為詳細程序
- 請求被發送到本機埠8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
- Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應
- Engine獲得請求localhost/yy/index.jsp,匹配它所擁有的所有虛擬主機Host
- Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機)
- localhost Host獲得請求/yy/index.jsp,匹配它所擁有的所有Context
- Host匹配到路徑為/yy的Context(如果匹配不到就把該請求交給路徑名為”“的Context去處理)
- path=”/yy”的Context獲得請求/index.jsp,在它的mapping table中尋找對應的servlet
- Context匹配到URL PATTERN為*.jsp的servlet,對應于JspServlet類
- 構造HttpServletRequest物件和HttpServletResponse物件,作為引數呼叫JspServlet的doGet或doPost方法
- Context把執行完了之后的HttpServletResponse物件回傳給Host
- Host把HttpServletResponse物件回傳給Engine
- Engine把HttpServletResponse物件回傳給Connector
- Connector把HttpServletResponse物件回傳給客戶browser
十五.Tomcat作業模式?
- Tomcat是一個JSP/Servlet容器,其作為Servlet容器,有三種作業模式:獨立的Servlet容器、行程內的Servlet容器和行程外的Servlet容器,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292945.html
標籤:java
