面試遇到Tomcat,你需要知道這些常識
1、==Tomcat 的缺省端口是多少,怎么修改?==

1)找到 Tomcat 目錄下的 conf 文件夾
2)進(jìn)入 conf 文件夾里面找到 server.xml 文件
3)打開 server.xml 文件
4)在 server.xml 文件里面找到下列信息
port="8080"改成你想要的端口
2、==tomcat 有哪幾種 Connector 運(yùn)行模式(優(yōu)化)?==
bio:傳統(tǒng)的 Java I/O 操作,同步且阻塞 IO。
maxThreads=”150” Tomcat 使用線程來處理接收的每個請求。這個值表示Tomcat 可創(chuàng)建的最大線程數(shù)。默認(rèn)值 200。可以根據(jù)機(jī)器的時期性能和內(nèi)存大小調(diào)整,一般可以在 400-500。最大可以在 800 左右。
minSpareThreads=”25” Tomcat 初始化時創(chuàng)建的線程數(shù)。默認(rèn)值 4。如果當(dāng)前沒有空閑線程,且沒有超過 maxThreads,一次性創(chuàng)建的空閑線程數(shù)量。Tomcat 初始化時創(chuàng)建的線程數(shù)量也由此值設(shè)置。
maxSpareThreads=”75” 一旦創(chuàng)建的線程超過這個值,Tomcat 就會關(guān)閉不再需要的 socket 線程。默認(rèn)值 50。一旦創(chuàng)建的線程超過此數(shù)值,Tomcat 會關(guān)閉不再需要的線程。線程數(shù)可以大致上用 “同時在線人數(shù)每秒用戶操作次數(shù)系統(tǒng)平均操作時間” 來計(jì)算。
acceptCount=”100” 指定當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊(duì)列中的請求數(shù),超過這個數(shù)的請求將不予處理。默認(rèn)值10。如果當(dāng)前可用線程數(shù)為 0,則將請求放入處理隊(duì)列中。這個值限定了請求隊(duì)列的大小,超過這個數(shù)值的請求將不予處理。
connectionTimeout=”20000” 網(wǎng)絡(luò)連接超時,默認(rèn)值 20000,單位:毫秒。設(shè)置為 0 表示永不超時,這樣設(shè)置有隱患的。通常可設(shè)置為 30000 毫秒。
nio:JDK1.4 開始支持,同步非阻塞 IO
同步阻塞或同步非阻塞 IO。指定使用 NIO 模型來接受 HTTP 請求protocol=”org.apache.coyote.http11.Http11NioProtocol” 指定使用 NIO 模型來接受 HTTP 請求。默認(rèn)BlockingIO,配置為 protocol=”HTTP/1.1”
acceptorThreadCount=”2” 使用 NIO 模型時接收線程的數(shù)目
aio(nio.2):JDK7 開始支持,異步非阻塞 IO。
apr:Tomcat 將以 JNI 的形式調(diào)用 Apache HTTP 服務(wù)器的核心動態(tài)鏈接庫來處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地 提高 Tomcat 對靜態(tài)文件的處理性能。
其他配置:
maxHttpHeaderSize="8192" http 請求頭信息的最大程度,超過此長度的部分不予處理。一般 8K。
URIEncoding="UTF-8" 指定 Tomcat 容器的 URL 編碼格式。
disableUploadTimeout="true" 上傳時是否使用超時機(jī)制
enableLookups="false" 是否反查域名,默認(rèn)值為 true。為了提高處理能力,應(yīng)設(shè)置為 false
compression="on" 打開壓縮功能
compressionMinSize="10240" 啟用壓縮的輸出內(nèi)容大小,默認(rèn)為 2KB
noCompressionUserAgents="gozilla, traviata" 對于以下的瀏覽器,不啟用壓縮
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮
==3、Tomcat 有幾種部署方式?==
1)直接把Web 項(xiàng)目放在webapps 下,Tomcat 會自動將其部署
2)在 server.xml 文件上配置
3)通過 Catalina 來進(jìn)行配置:進(jìn)入到 conf\Catalina\localhost文件下,創(chuàng)建一個xml 文件,該文件的名字就是站點(diǎn)的名字。編寫 XML 的方式來進(jìn)行設(shè)置。(沒試過!!!)
4、tomcat 容器是如何創(chuàng)建 servlet 類實(shí)例?用到了什么原理?
當(dāng)容器啟動時,會讀取在webapps 目錄下所有的 web 應(yīng)用中的 web.xml 文件,然后對 xml 文件進(jìn)行解析,并讀取 servlet 注冊信息。然后,將每個應(yīng)用中注冊的 servlet 類都進(jìn)行加載,并通過反射的方式實(shí)例化。(有時候也是在第一次請求時實(shí)例化)在 servlet 注冊時加上如果為正數(shù),則在一開始就實(shí)例化,如果不寫或?yàn)樨?fù)數(shù),則第一次請求實(shí)例化。
5.==tomcat 如何優(yōu)化?==
優(yōu)化連接配置.這里以 tomcat7 的參數(shù)配置為例,需要修改 conf/server.xml文件,修改連接數(shù),關(guān)閉客戶端 dns 查詢。
參數(shù)解釋:
URIEncoding=”UTF-8″:使得 tomcat 可以解析含有中文名的文件的 url,真方便,不像 apache 里還有搞個 mod_encoding,還要手工編譯
maxSpareThreads : 如果空閑狀態(tài)的線程數(shù)多于設(shè)置的數(shù)目,則將這些線程中止,減少這個池中的線程總數(shù)。
minSpareThreads : 最小備用線程數(shù),tomcat 啟動時的初始化的線程數(shù)。
enableLookups: 這個功效和 Apache 中的 HostnameLookups 一樣,設(shè)為關(guān)閉。
connectionTimeout: connectionTimeout 為網(wǎng)絡(luò)連接超時時間毫秒數(shù)。
maxThreads : maxThreads Tomcat 使用線程來處理接收的每個請求。這個值表示 Tomcat 可創(chuàng)建的最大的線程數(shù),即最大并發(fā)數(shù)。
acceptCount : acceptCount 是當(dāng)線程數(shù)達(dá)到 maxThreads 后,后續(xù)請求會被放入一個等待隊(duì)列,這個 acceptCount 是這個隊(duì)列的大小,如果這個隊(duì)列也滿了,就直接 refuse connection
maxProcessors 與 minProcessors : 在 Java 中線程是程序運(yùn)行時的路徑,是在一個程序中與其它控制線程無關(guān)的、能夠獨(dú)立運(yùn)行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出 CPU 最 大利用率的高效程序,使空閑時間保持最低,從而接受更多的請求。通常 Windows 是 1000 個左右,Linux 是 2000 個左右。
useURIValidationHack:我們來看一下 tomcat 中的一段源碼:
【security】 if (connector.getUseURIValidationHack()) { String uri = validate(request.getRequestURI()); if (uri == null) { res.setStatus(400); res.setMessage(“Invalid URI”); throw new IOException(“Invalid URI”); } else { req.requestURI().setString(uri); // Redoing the URI decoding req.decodedURI().duplicate(req.requestURI()); req.getURLDecoder().convert(req.decodedURI(), true);
可以看到如果把 useURIValidationHack 設(shè)成”false”,可以減少它對一些 url的不必要的檢查從而減省開銷。
enableLookups=”false” : 為了消除 DNS 查詢對性能的影響我們可以關(guān)閉DNS 查詢,方式是修改 server.xml 文件中的 enableLookups 參數(shù)值。
disableUploadTimeout: 類似于 Apache 中的 keeyalive 一樣給 Tomcat 配置 gzip 壓縮(HTTP 壓縮)功能
compression=”on” compressionMinSize=”2048″ compressableMimeType=”text/html,text/xml,text/JavaScript,text/css,text/plain” HTTP 壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶端請求網(wǎng)頁后,從服務(wù)器端將網(wǎng)頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽。相對于普通的瀏覽過程 HTML,CSS,javascript , Text ,它可以節(jié)省 40%左右的流量。更為重要的是,它可以對動態(tài)生成的,包括 CGI、PHP ,JSP , ASP , Servlet,SHTML 等輸出的網(wǎng)頁也能進(jìn)行壓縮,壓縮效率驚人。
1)compression=”on” 打開壓縮功能
2)compressionMinSize=”2048″ 啟用壓縮的輸出內(nèi)容大小,這里面默認(rèn)為2KB
3)noCompressionUserAgents=”gozilla, traviata” 對于以下的瀏覽器,不啟用壓縮
4)compressableMimeType=”text/html,text/xml” 壓縮類型
最后不要忘了把 8443 端口的地方也加上同樣的配置,因?yàn)槿绻覀冏?https 協(xié)議的話,我們將會用到 8443 端口這個段的配置
6.==內(nèi)存調(diào)優(yōu)==
內(nèi)存方式的設(shè)置是在 catalina.sh 中,調(diào)整一下 JAVA_OPTS 變量即可,因?yàn)楹竺娴膯訁?shù)會把 JAVA_OPTS 作為 JVM 的啟動參數(shù)來處理。具體設(shè)置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4"
其各項(xiàng)參數(shù)如下:
7.==垃圾回收策略調(diào)優(yōu)==
垃圾回收的設(shè)置也是在 catalina.sh 中,調(diào)整 JAVA_OPTS 變量。具體設(shè)置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100"
具體的垃圾回收策略及相應(yīng)策略的各項(xiàng)參數(shù)如下:
串行收集器(JDK1.5 以前主要的回收方式)
-XX:+UseSerialGC:設(shè)置串行收集器
并行收集器(吞吐量優(yōu)先)示例:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
并發(fā)收集器(響應(yīng)時間優(yōu)先)示例:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC
8.共享 session 處理
目前的處理方式有如下幾種:
1).使用 Tomcat 本身的 Session :復(fù)制功能,方案的有點(diǎn)是配置簡單,缺點(diǎn)是當(dāng)集群數(shù)量較多時,Session 復(fù)制的時間會比較長,影響響應(yīng)的效率
2).使用第三方來存放共享 Session :目前用的較多的是使用 memcached 來管理共享 Session,借助于memcached-sesson-manager 來進(jìn)行 Tomcat 的 Session 管理(使用 MSM 管理 Tomcat 集群session)
3).使用黏性 session 的策略:對于會話要求不太強(qiáng)(不涉及到計(jì)費(fèi),失敗了允許重新請求下等)的場合,同一個用戶的 session 可以由 nginx 或者 apache 交給同一個 Tomcat 來處理,這就是所謂的 session sticky 策略,目前應(yīng)用也比較多(tomcat session sticky)nginx 默認(rèn)不包含 session sticky 模塊,需要重新編譯才行,優(yōu)點(diǎn)是處理效率高多了,缺點(diǎn)是強(qiáng)會話要求的場合不合適
9.添加 JMS 遠(yuǎn)程監(jiān)控
對于部署在局域網(wǎng)內(nèi)其它機(jī)器上的 Tomcat,可以打開 JMX 監(jiān)控端口,局域網(wǎng)其它機(jī)器就可以通過這個端口查看一些常用的參數(shù)(但一些比較復(fù)雜的功能不支持),同樣是在 JVM 啟動參數(shù)中配置即可,配置如下:
-Dcom.sun.management.jmxremote.ssl=false - Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.71.38 設(shè)置 JVM 的 JMS 監(jiān)控監(jiān)聽的 IP地址,主要是為了防止錯誤的監(jiān)聽成 127.0.0.1 這個內(nèi)網(wǎng)地址 -Dcom.sun.management.jmxremote.port=1090 設(shè)置 JVM 的 JMS 監(jiān)控的端口 -Dcom.sun.management.jmxremote.ssl=false 設(shè)置 JVM 的 JMS 監(jiān)控不實(shí)用SSL -Dcom.sun.management.jmxremote.authenticate=false 設(shè)置 JVM 的 JMS 監(jiān)控不需要認(rèn)證
10.專業(yè)點(diǎn)的分析工具有
IBM ISA,JProfiler、probe 等,具體監(jiān)控及分析方式去網(wǎng)上搜索即可
10.關(guān)于 Tomcat 的 session 數(shù)目
這個可以直接從 Tomcat 的 web 管理界面去查看即可 ;或者借助于第三方工具 Lambda Probe 來查看,它相對于 Tomcat 自帶的管理稍微多了點(diǎn)功能,但也不多 ;
11.監(jiān)視 Tomcat 的內(nèi)存使用情況
使用 JDK 自帶的 jconsole 可以比較明了的看到內(nèi)存的使用情況,線程的狀態(tài),當(dāng)前加載的類的總量等;JDK 自帶的 jvisualvm 可以下載插件(如 GC 等),可以查看更豐富的信息。如果是分析本地的 Tomcat 的話,還可以進(jìn)行內(nèi)存抽樣等,檢查每個類的使用情況
12.打印類的加載情況及對象的回收情況
這個可以通過配置 JVM 的啟動參數(shù),打印這些信息(到屏幕(默認(rèn)也會到catalina.log 中)或者文件),具體參數(shù)如下:
13.==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; }
Nginx+tomcat方式部署,反向代理,動靜結(jié)合
首先 dns 解析 wo.de.tian 機(jī)器,一般是 ng 服務(wù)器 ip 地址然后 ng 根據(jù) server 的配置,尋找路徑為 yy/的機(jī)器列表,ip 和端口最后 選擇其中一臺機(jī)器進(jìn)行訪問—
14. ==Tomcat 工作模式?==
Tomcat 是一個 JSP/Servlet 容器。其作為 Servlet 容器,有三種工作模式:
獨(dú)立的 Servlet 容器
進(jìn)程內(nèi)的 Servlet 容器
進(jìn)程外的 Servlet 容器。
進(jìn)入 Tomcat 的請求可以根據(jù) Tomcat 的工作模式分為如下兩類:
Tomcat 作為應(yīng)用程序服務(wù)器(狹義的后端,前后端分離方式):請求來自于前端的 web 服務(wù)器,這可能是Apache, IIS, Nginx 等;
Tomcat 作為獨(dú)立服務(wù)器(廣義的后端,前后端不分離的方式):請求來自于 web 瀏覽器;
Tomcat 任務(wù)調(diào)度 容器
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。