6道tomcat面試題,最後兩道難倒我了

即將進入金三銀四的黃金時段,因此不少人已經開始準備本身的面試抱佛腳了。今天我整理了6道關於tomcat的核心面試題以及參看答案,看完對於絕大多數人應對面試妥妥的。css

圖片

一、Tomcat的缺省端口是多少,怎麼修改?

默認端口爲8080,能夠經過在tomcat安裝包conf目錄下,service.xml中的Connector元素的port屬性來修改端口。前端

二、tomcat 有哪幾種Connector 運行模式(優化)?

這三種模式的不一樣之處以下:java

BIO:一個線程處理一個請求。缺點:併發量高時,線程數較多,浪費資源。Tomcat7版本或更低版本中,在Linux系統中默認使用這種方式。nginx

NIO:利用Java的異步IO處理,能夠經過少許的線程處理大量的請求。tomcat8.0.x中默認使用的是NIO。Tomcat7必須修改Connector配置來啓動:web

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"          connectionTimeout="20000" redirectPort="8443"/> 

APR:即Apache Portable Runtime,從操做系統層面解決io阻塞問題。Tomcat7或Tomcat8在Win7或以上的系統中啓動默認使用這種方式。面試

三、Tomcat有幾種部署方式?

  • 利用Tomcat的自動部署:把web應用拷貝到webapps目錄(生產環境不建議放在該目錄中)。Tomcat在啓動時會加載目錄下的應用,並將編譯後的結果放入work目錄下。
  • 使用Manager App控制檯部署:在tomcat主頁點擊「Manager App」 進入應用管理控制檯,能夠指定一個web應用的路徑或war文件。
  • 修改conf/server.xml文件部署:在server.xml文件中,增長Context節點能夠部署應用。
  • 增長自定義的Web部署文件:在conf/Catalina/localhost/路徑下增長 xyz.xml文件,內容是Context節點,能夠部署應用。

四、tomcat容器是如何建立servlet類實例?用到了什麼原理?

  1. 當容器啓動時,會讀取在webapps目錄下全部的web應用中的web.xml文件,而後對 xml文件進行解析,並讀取servlet註冊信息。而後,將每一個應用中註冊的servlet類都進行加載,並經過 反射的方式實例化。(有時候也是在第一次請求時實例化)
  2. 在servlet註冊時加上1若是爲正數,則在一開始就實例化,若是不寫或爲負數,則第一次請求實例化。

五、tomcat 如何優化?

tomcat做爲Web服務器,它的處理性能直接關係到用戶體驗,下面是幾種常見的優化措施:apache

掉對web.xml的監視,把jsp提早編輯成Servlet。有富餘物理內存的狀況,加大tomcat使用的jvm的內存後端

服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。api

  • 對於高併發狀況下會有大量的運算,那麼CPU的速度會直接影響處處理速度。
  • 內存在大量數據處理的狀況下,將會有較大的內存容量需求,能夠用-Xmx -Xms -XX:MaxPermSize等參數對內存不一樣功能塊進行劃分。咱們以前就遇到過內存分配不足,致使虛擬機一直處於full GC,從而致使處理能力嚴重降低。
  • 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成爲性能瓶頸。最好的辦法仍是利用下面提到的緩存。

利用緩存和壓縮緩存

  • 對於靜態頁面最好是可以緩存起來,這樣就沒必要每次從磁盤上讀。這裏咱們採用了Nginx做爲緩存服務器,將圖片、css、js文件都進行了緩存,有效的減小了後端tomcat的訪問。
  • 另外,爲了能加快網絡傳輸速度,開啓gzip壓縮也是必不可少的。但考慮到tomcat已經須要處理不少東西了,因此把這個壓縮的工做就交給前端的Nginx來完成。
  • 除了文本能夠用gzip壓縮,其實不少圖片也能夠用圖像處理工具預先進行壓縮,找到一個平衡點可讓畫質損失很小而文件能夠減少不少。曾經我就見過一個圖片從300多kb壓縮到幾十kb,本身幾乎看不出來區別。

採用集羣

單個服務器性能老是有限的,最好的辦法天然是實現橫向擴展,那麼組建tomcat集羣是有效提高性能的手段。咱們仍是採用了Nginx來做爲請求分流的服務器,後端多個tomcat共享session來協同工做。能夠參考以前寫的《利用nginx+tomcat+memcached組建web服務器負載均衡》。

優化線程數優化

找到Connector port="8080" protocol="HTTP/1.1",增長maxThreads和acceptCount屬性(使acceptCount大於等於maxThreads),以下:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />

其中:

• maxThreads:tomcat可用於請求處理的最大線程數,默認是200
• minSpareThreads:tomcat初始線程數,即最小空閒線程數
• maxSpareThreads:tomcat最大空閒線程數,超過的會被關閉
• acceptCount:當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理.默認100

使用線程池優化

在server.xml中增長executor節點,而後配置connector的executor屬性,以下:

<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>

其中:

• namePrefix:線程池中線程的命名前綴
• maxThreads:線程池的最大線程數
• minSpareThreads:線程池的最小空閒線程數
• maxIdleTime:超過最小空閒線程數時,多的線程會等待這個時間長度,而後關閉
• threadPriority:線程優先級

:當tomcat併發用戶量大的時候,單個jvm進程確實可能打開過多的文件句柄,這時會報java.net.SocketException:Too many open files錯誤。可以使用下面步驟檢查:

• ps -ef |grep tomcat 查看tomcat的進程ID,記錄ID號,假設進程ID爲10001
• lsof -p 10001|wc -l 查看當前進程id爲10001的 文件操做數
• 使用命令:ulimit -a 查看每一個用戶容許打開的最大文件數

啓動速度優化

  • 刪除沒用的web應用:由於tomcat啓動每次都會部署這些應用。

  • 關閉WebSocket:websocket-api.jar和tomcat-websocket.jar

  • 隨機數優化:設置JVM參數:-Djava.security.egd=file:/dev/./urandom

內存優化

由於tomcat啓動起來後就是一個java進程,因此這塊能夠參照JVM部分的優化思路。堆內存相關參數,好比說:

• -Xms:虛擬機初始化時的最小堆內存。

• -Xmx:虛擬機可以使用的最大堆內存。-Xms與-Xmx設成同樣的值,避免JVM由於頻繁的GC致使性能大起大落 

• -XX:MaxNewSize:新生代佔整個堆內存的最大值。

另外還有方法區參數調整(注意:JDK版本)、垃圾收集器等優化。JVM相關參數請看:手把手教你設置JVM調優參數

六、熟悉tomcat的哪些配置?

Context(表示一個web應用程序,一般爲WAR文件,關於WAR的具體信息見servlet規範)標籤。

docBase:該web應用的文檔基準目錄(Document Base,也稱爲Context Root),或者是WAR文件的路徑。可使絕對路徑,也可使用相對於context所屬的Host的appBase路徑。

path:表示此web應用程序的url的前綴,這樣請求的url爲http://localhost:8080/path/****

reloadable:這個屬性很是重要,若是爲true,則tomcat會自動檢測應用程序的/WEB-INF/lib和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,咱們能夠在不重啓tomcat的狀況下改變應用程序。

useNaming:若是但願Catalina爲該web應用使能一個JNDI InitialContext對象,設爲true。該InitialialContext符合J2EE平臺的約定,缺省值爲true。

workDir:Context提供的臨時目錄的路徑,用於servlet的臨時讀/寫。利用javax.servlet.context.tempdir屬性,servlet能夠訪問該目錄。若是沒有指定,使用$CATALINA_HOME/work下一個合適的目錄。

swallowOutput:若是該值爲true,System.out和System.err的輸出被重定向到web應用的logger。若是沒有指定,缺省值爲false

debug:與這個Engine關聯的Logger記錄的調試信息的詳細程度。數字越大,輸出越詳細。若是沒有指定,缺省爲0。

host(表示一個虛擬主機)標籤。

name:指定主機名。

appBase:應用程序基本目錄,即存放應用程序的目錄。

unpackWARs:若是爲true,則tomcat會自動將WAR文件解壓,不然不解壓,直接從WAR文件中運行應用程序。

Logger(表示日誌,調試和錯誤信息)標籤。

className:指定logger使用的類名,此類必須實現org.apache.catalina.Logger接口。

prefix:指定log文件的前綴。

suffix:指定log文件的後綴。

timestamp:若是爲true,則log文件名中要加入時間,以下例:localhost_log.2001-10-04.txt

總結

本文一共六道關於tomcat的題目:

  • Tomcat的缺省端口是多少,怎麼修改?

  • tomcat 有哪幾種Connector 運行模式(優化)?

  • Tomcat有幾種部署方式?

  • tomcat容器是如何建立servlet類實例?用到了什麼原理?

  • tomcat 如何優化?熟悉tomcat的哪些配置?

再次回頭想一想你會幾道呢?

「作人能夠沒天賦,但不能沒鬥志。」

相關文章
相關標籤/搜索