常見面試題(九)tomcat

1、簡單講講tomcat結構,以及其類加載器流程,線程模型等

模塊組成結構:Tomcat的核心組件就Connector和Container,一個Connector+一個Container(Engine)構成一個Service,Service就是對外提供服務的組件,有了Service組件Tomcat就能對外提供服務了,但是光有服務還不行,還需要有環境讓你提供服務纔行,所以最外層的Server就是爲Service提供了生存的土壤。

        ▁▂▃ Connector是一個連接器,主要負責接受請求並把請求交給Container,Container就是一個容器,主要裝的是具有處理請求的組件。Service主要是爲了關聯Container與Connect,只有兩個結合起來才能夠處理一個請求。Server負責管理Service集合,從圖中我們可以看到Tomcat可以提供多種服務,那麼這些Service就是由Server來管理的。具體工作包括:對外提供一個接口訪問Service,對內維護Service集合,維護Service集合包括管理Service聲明週期等等。

   ☞ 文檔結構組成:

 

<!-- Server代表整個容器,是Tomcat的頂層元素。服務器默認在8005端口,shutdown命令=關閉Tomcat -->

<Server>

<Listener />

<GlobaNamingResources>

</GlobaNamingResources>

<!-- Service包含多個Connector元素,而這些Connector元素共享一個Engine元素。 -->

<Service>

<!-- Connector元素代表與客戶時間交互的組件,它負責接收客戶的請求,已經向客戶響應結果,

配置http爲https主要是修改Connector -->

<Connector />

<!-- 每個Service只能有一個Engine元素,處理同一個Service中所有Connector元素接收到的客戶請求.

Engine用來處理Connetcor收到的Http請求它匹配請求和自己的虛擬主機,並把請求轉給對應的Host來處理 -->

<Engine>

<Logger />

<Realm />

<!-- 一個Engine包含多個host元素,每個host元素定義了一個虛擬主機,它包含一個或多個Web應用 -->

<host>

<Logger />

<!-- 由Context接口定義.是使用最頻繁的元素,對應於一個Web App -->

<Context />

</host>

</Engine>

</Service>

</Server>

 ☞  類加載器流程:Tomcat啓動時,會創建以下4種類加載器:

      1)、Bootstrap 引導類加載器:加載JVM啓動所需的類,以及標準擴展類(位於jar/lib/ext上)

      2)、System 系統類加載器:加載Tomcat啓動時的類,比如bootstrap.jar通常在catalina.bat或者catalina.sh中指定。指定位置位於CATALINA_HOME/bin下。

       

      3)、Common 通用類加載器:加載tomcat使用以及應用通用的一些類,位於CATALINA_HOME/lib下,比如servlet-api.jar

       

     4)、webapp應用類加載器:每個應用在創建後,都會創建一個唯一的類加載器。該類加載器會加載位於WEB-INF/lib下的jar文件中的class和WEB-INF/classes下的class文件。

     

     紅色虛線表示:應用需要到某個類時,則會按照下面的順序進行類加載。

     ①、使用bootstrap引導類加載器加載

     ②、使用system系統類加載器加載

     ③、使用應用類加載器在WEB-INF/classes中加載

     ④、使用應用類加載器在WEB-INF/lib中加載

     ⑤、使用common類加載器在CATALINA_HOME/lib中加載

 

 ☞  線程模型:支持以下四種線程模型。

 

2、tomcat如何調優,涉及哪些參數 ?

 ☞ Tomcat調優主要從四個方面考慮:1)、吞吐量。2)、Responsetime。 3)、Cpuload。 4)、MemoryUsage。

 ☞ 參數調優:1)、Tomcat啓動參數的優化:Tomcat 的啓動參數位於tomcat的安裝目錄\bin目錄下,如果你是Linux操作系統就是catalina.sh文件,如果你是Windows操作系統那麼你需要改動的就是catalina.bat文件。

   ✔ Linux系統中catalina.sh文件中添加如下參數(重要參數隨後說明):

 

export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking

-XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled

-XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods

-XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

  ◀ -Server(重要):只要Tomcat是運行在生產環境中,這個參數必須添加。因爲Tomcat默認是java-client模式運行,添加server後表示以真實的production的模式運行,將擁有更大、更高的併發處理能力,更快、更強的JVM垃圾回收機制,可以獲得更多的負載和吞吐量等等。

  ◀ -Xms -Xmx:既JVM內存設置了,把Xms與Xmx兩個值設成一樣是最優的做法。(否則當內存=Xmx向Xms變化時,CPU高速運轉觸發垃圾回收機制,嚴重時會導致系統‘卡殼’,因此一開始我們就把這兩個設成一樣,使得Tomcat在啓動時就爲最大化參數充分利用系統的效率。)

   ※在設這個最大內存即Xmx值時請先打開一個命令行:能夠正常顯示JDK的版本信息,說明這個值能夠用。

  

  ◀ -Xmn:設置年輕代大小爲512m。整個堆大小=年輕代 + 老年代 + 持久代。持久代一般固定大小爲64m,所以增大年輕代後,將會減小年老代。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。

  ◀ -Xss:是指設定每個線程的堆棧大小。這個就要依據程序,看一個線程大約需要佔用多少內存,可能會有多少線程同時運行等。一般不易設置超過1M,要不然容易出現out ofmemory。

2)、Tomcat容器內優化:打開tomcat安裝目錄\conf\server.xml文件。   其中如下參數的默認值遠遠不夠我們使用,我們對其進行了更改,更改後的配置如下:

 

<Connector port="8080" protocol="HTTP/1.1"          

URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"         

enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" 

acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5"

useURIValidationHack="false"    

compression="on" compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 

redirectPort="8443" />

  ▶ URIEncoding=”UTF-8”:使得tomcat可以解析含有中文名的文件的url。

  ▶ minSpareThreads:最小備用線程數,tomcat啓動時的初始化的線程數。

  ▶ maxSpareThreads:如果空閒狀態的線程數多於設置的數目,則將這些線程中止,減少這個池中的線程總數。

  ▶ connectionTimeout:網絡連接超時時間毫秒數。

  ▶ maxThreads:Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數,即最大併發數。

  ▶ acceptCount:當線程數達到maxThreads後,後續請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,如果這個隊列也滿了,就直接refuse connection。

  ▶ maxProcessors與minProcessors:在 Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最大利用率的高效程序,使空閒時間保持最低,從而接受更多的請求。 通常Windows是1000個左右,Linux是2000個左右。

  ▶ useURIValidationHack:設成"false",可以減少它對一些url的不必要的檢查從而減省開銷。

  ▶ enableLookups:設置爲"false",主要爲了消除DNS查詢對性能的影響我們可以關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值

  ▶ disableUploadTimeout:允許Servlet容器,正在執行使用一個較長的連接超時值,以使Servlet有較長的時間來完成它的執行,默認值爲false

  ▶ 給Tomcat配置gzip壓縮(HTTP壓縮)功能:HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從服務器端將網頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML、CSS、Javascript、Text ,它可以節省40%左右的流量。更爲重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、 Servlet、SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。

    1)、compression="on" 打開壓縮功能

    2)、compressionMinSize="2048" 啓用壓縮的輸出內容大小,這裏面默認爲2KB

    3)、noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啓用壓縮

    4)、compressableMimeType="text/html,text/xml" 壓縮類型

  ▶ redirectPort: 如果我們走https協議的話,我們將會用到8443端口這個段的配置。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章