面試遇到Tomcat,你需要知道這些常識

      網(wǎng)友投稿 1105 2025-04-01

      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 文件上配置節(jié)點(diǎn),設(shè)置相關(guān)的屬性即可

      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ù)。

      面試遇到Tomcat,你需要知道這些常識

      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)容。

      上一篇:Java仿一個低配版的Everything軟件
      下一篇:excel設(shè)置顯示公式欄的教程
      相關(guān)文章
      亚洲第一黄片大全| 亚洲sm另类一区二区三区| 久久精品国产亚洲Aⅴ香蕉| 午夜在线亚洲男人午在线| 亚洲大尺度无码无码专线一区| 激情内射亚洲一区二区三区爱妻 | 亚洲AV电影天堂男人的天堂| 亚洲中文字幕久久精品蜜桃| 亚洲一级特黄特黄的大片| 久久综合久久综合亚洲| 亚洲熟妇自偷自拍另欧美| 亚洲午夜精品一区二区麻豆| 亚洲αⅴ无码乱码在线观看性色| 亚洲成av人无码亚洲成av人| 亚洲aⅴ无码专区在线观看| 国产亚洲一卡2卡3卡4卡新区| 日韩精品亚洲专区在线观看| www亚洲精品久久久乳| 亚洲国产一成久久精品国产成人综合 | 在线aⅴ亚洲中文字幕| 亚洲人成人伊人成综合网无码| 亚洲日韩一区二区一无码| 亚洲成a人片在线观看天堂无码| 国产精品亚洲小说专区| 亚洲国产一成久久精品国产成人综合| 亚洲真人日本在线| 亚洲精品国产精品乱码不99 | 亚洲jizzjizz少妇| 亚洲成年人啊啊aa在线观看| 亚洲一区精品无码| 久久噜噜噜久久亚洲va久| 亚洲视频在线观看免费视频| 亚洲av日韩av无码av| 亚洲精品永久在线观看| 在线亚洲精品视频| 毛茸茸bbw亚洲人| 久久亚洲国产伦理| 2020年亚洲天天爽天天噜| 亚洲精品天堂无码中文字幕| 亚洲精品国产V片在线观看 | 亚洲精品无码久久久久秋霞|