天天看點

Java面試題tomcat篇

作者:CameSawConquer

1、Tomcat的預設端口是多少,怎麼修改?

預設端口為8080,可以通過在tomcat安裝包conf目錄下,service.xml中的Connector元素的port屬性來修改端口。

2、tomcat 有哪幾種Connector 運作模式(優化)?

這三種模式的不同之處如下:

  • BIO :一個線程處理一個請求。缺點:并發量高時,線程數較多,浪費資源。Tomcat7版本或更低版本中,在Linux系統中預設使用這種方式。
  • NIO :利用Java的異步IO處理,可以通過少量的線程處理大量的請求。tomcat8.0.x中預設使用的是NIO。Tomcat7必須修改Connector配置來啟動:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
connectionTimeout="20000" redirectPort="8443"/>           
  • APR :即Apache Portable Runtime,從作業系統層面解決io阻塞問題。Tomcat7或Tomcat8在Win7或以上的系統中啟動預設使用這種方式。

3、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節點,可以部署應用。

4、tomcat容器是如何建立servlet類執行個體?用到了什麼原理?

1. 當容器啟動時,會讀取在webapps目錄下所有的web應用中的web.xml檔案,然後對 xml檔案進行解析,并讀取servlet注冊資訊。然後,将每個應用中注冊的servlet類都進行加載,并通過反射的方式執行個體化。(有時候也是在第一次請求時執行個體化)

2. 在servlet注冊時加上1如果為正數,則在一開始就執行個體化,如果不寫或為負數,則第一次請求執行個體化。

5、tomcat 如何優化?

tomcat作為Web伺服器,它的處理性能直接關系到使用者體驗,下面是幾種常見的優化措施:

切掉對web.xml的監視,把jsp提前編輯成Servlet。有富餘實體記憶體的情況,加大tomcat使用的jvm的記憶體伺服器所能提供CPU、記憶體、硬碟的性能對處理能力有決定性影響。

  • 對于高并發情況下會有大量的運算,那麼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 fifiles錯誤。可使用下面步驟檢查:

• 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版本)、垃圾收集器等優化。

6、熟悉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。

7、Tomcat是什麼?

Tomcat 伺服器Apache軟體基金會項目中的一個核心項目,是一個免費的開放源代碼的Web 應用伺服器(Servlet容器),屬于輕量級應用伺服器,在中小型系統和并發通路使用者不是很多的場合下被普遍使用,是開發和調試JSP 程式的首選。

8,什麼是Servlet呢?

Servlet是JavaEE規範的一種,主要是為了擴充Java作為Web服務的功能,統一接口。由其他内部廠商如tomcat,jetty内部實作web的功能。如一個http請求到來:容器将請求封裝為servlet中的HttpServletRequest對象,調用init(),service()等方法輸出response,由容器包裝為httpresponse傳回給用戶端的過程。

Java面試題tomcat篇

9,什麼是Servlet規範?

從 Jar 包上來說,Servlet 規範就是兩個 Jar 檔案。servlet-api.jar 和 jsp-api.jar,Jsp 也是一種Servlet。

從package上來說,就是 javax.servlet 和 javax.servlet.http 兩個包。

從接口來說,就是規範了 Servlet 接口、Filter 接口、Listener 接口、ServletRequest 接口、ServletResponse 接口等。類圖如下:

Java面試題tomcat篇

10、為什麼我們将tomcat稱為Web容器或者Servlet容器 ?

我們用一張圖來表示他們之間的關系:

Java面試題tomcat篇

簡單的了解:啟動一個ServerSocket,監聽8080端口。Servlet容器用來裝我們開發的Servlet。

11,tomcat是如何處理Http請求流程的?

假設來我們在浏覽器上輸入http://localhost:8080/my-web-mave/index.jsp,在tomcat中是如何處理這個請求流程的:

1. 我們的請求被發送到本機端口8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得。

2. Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應 。

3. Engine獲得請求localhost/my-web-maven/index.jsp,比對它所擁有的所有虛拟主機Host ,我們的虛拟主機在server.xml中預設配置的就是localhost。

4. Engine比對到name=localhost的Host(即使比對不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機)。

5. localhost Host獲得請求/my-web-maven/index.jsp,比對它所擁有的所有Context。

6. Host比對到路徑為/my-web-maven的Context(如果比對不到就把該請求交給路徑名為”"的Context去處理)。

7. path=”/my-web-maven”的Context獲得請求/index.jsp,在它的mapping table中尋找對應的servlet 。

8. Context比對到URL PATTERN為*.jsp的servlet,對應于JspServlet類。

9. 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法 。

10. Context把執行完了之後的HttpServletResponse對象傳回給Host 。

11. Host把HttpServletResponse對象傳回給Engine 。

12. Engine把HttpServletResponse對象傳回給Connector 。

13. Connector把HttpServletResponse對象傳回給客戶browser 。

12、tomcat結構目錄有哪些?

Java面試題tomcat篇

bin

啟動,關閉和其他腳本。這些 .sh檔案(對于Unix系統)是這些.bat檔案的功能副本(對于Windows系統)。由于Win32指令行缺少某些功能,是以此處包含一些其他檔案。

比如說:windows下啟動tomcat用的是startup.bat,另外Linux環境中使用的是startup.sh。對應還有相應的shutdown關閉腳本。

conf

  • tomcat的配置檔案和相關的DTD。這裡最重要的檔案是server.xml。它是容器的主要配置檔案。
  • catalina.policy :tomcat:安全政策檔案,控制JVM相關權限,具體可以參考java.security.Permission。
  • catalina.properties :tomcat Catalina 行為控制配置檔案,比如:Common ClassLoader。
  • logging.properties :tomcat日志配置檔案。裡面的日志采用的是JDK Logging。
  • server.xml :tomcat server配置檔案(對于我開發人員來說是非常重要)。
  • context.xml :全局context配置檔案,監視并加載資源檔案,當監視的檔案發生發生變化時,自動加載 。
  • tomcat-user.xml :tomcat角色配置檔案。

web.xml :Servlet标準的web.xml部署檔案,tomcat預設實作部配置設定置 入内:

  • org.apache.catalina.servlets.DefaultServlet。
  • org.apache.jasper.servlet.JspServlet

logs

日志檔案預設位于此處。

localhost 有用,當你們的tomcat啟動不了的時候,多看這個檔案。比如:

  • NoClassDefFoundError
  • ClassNotFoundExceptionaccess 最沒用。

catalina.{date} 主要是控制台輸出,全部日志都在這裡面。

webapps

這是您的webapp所在的位置。其實這裡面這幾個都是一個項目。

簡化web部署的方式。線上上環境中我們的應用是不會放在這裡的。最好的辦法就是外置。

lib:tomcat存放共用的類庫。比如:

  • ecj-4.17.jar: eclipse Java編譯器
  • jasper.jar:JSP編譯器。

work

存放tomcat運作時編譯後的檔案,比如JSP編譯後的檔案 。

temp

存放運作時産生的臨時檔案。