即將進入金三銀四的黃金時段,因此不少人已經開始準備本身的面試抱佛腳了。今天我整理了6道關於tomcat的核心面試題以及參看答案,看完對於絕大多數人應對面試妥妥的。css
默認端口爲8080,能夠經過在tomcat安裝包conf目錄下,service.xml中的Connector元素的port屬性來修改端口。前端
這三種模式的不一樣之處以下: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或以上的系統中啓動默認使用這種方式。面試
conf/server.xml
文件部署:在server.xml
文件中,增長Context節點能夠部署應用。conf/Catalina/localhost/
路徑下增長 xyz.xml文件,內容是Context節點,能夠部署應用。tomcat做爲Web服務器,它的處理性能直接關係到用戶體驗,下面是幾種常見的優化措施:apache
掉對web.xml的監視,把jsp提早編輯成Servlet。有富餘物理內存的狀況,加大tomcat使用的jvm的內存後端
服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。api
利用緩存和壓縮
緩存
採用集羣
單個服務器性能老是有限的,最好的辦法天然是實現橫向擴展,那麼組建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調優參數
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的哪些配置?
再次回頭想一想你會幾道呢?
「作人能夠沒天賦,但不能沒鬥志。」