
我在 Ubuntu 12.04 伺服器上有一個 Tomcat 6 伺服器,具有 4GB 和以下 JAVA_OPTS
JAVA_OPTS="-Djava.awt.headless=true -Xms512M -Xmx512M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
愚蠢的問題:如果我多次部署相同的 webapp(相同的 war 檔案)(每次引用不同的 Postgres 資料庫)-如 server.com:8080/webapp1 server.com:8080/webapp2 等...
我可以假設 Tomcat 將在多個 Web 應用程式中快取一次類別檔案嗎?或者 - Tomcat 是否快取每個 Web 應用程式的類別?
預先感謝丹尼
答案1
答案取決於您的 Web 應用程式使用的類別文件的位置。
如果將給定的類別放入 $CATALINA_HOME/lib 的 Tomcat 公共類別載入器路徑中,它將可供所有 Web 應用程式使用。其緩存形式也是如此。
如果使用Tomcat Web應用程式類別載入器路徑為webapps/網路應用程式/WEB-INF/類別和 web 應用程式/網路應用程式/WEB-INF/lib 類別和對應的類別快取在應用程式之間是隔離的。
技術背景
Tomcat 不符合 Java 原生處理類別的方式,而是使用自訂 Java 類別載入器。
- Web 應用程式中的類別處理
- 每個 webapp 的類別緩存
- 在 Web 應用程式啟動/運行時預先載入和重新載入類
- 類別載入/引用的安全性
Tomcat 自訂類別載入器使用 Java 預設的 Bootstrap、Extension 和 System 類別載入器,但用 System 類別載入器使用的類別路徑變數取代自己的類別路徑。這具有以下效果:
- 用 Tomcats 自己的替代 Java 附帶的認可標準覆蓋機制。
在 Java 類別載入層次結構的末端新增兩個額外的類別載入器:
- Tomcat 通用類別載入器
- 每個 webapp 都有一個單獨的類別載入器
Tomcat 會忽略原始類別路徑。
一個關鍵細節是,webapp 類別載入器不會先將類別載入委託給其父級,而是嘗試根據請求載入每個類別。每個載入的類別隨後都會被相關的 webapp 類別載入器快取。此類載入器/快取等級不能在 Web 應用程式之間共用。
公共類別載入器載入的所有類別都可供所有 Web 應用程式公開使用,包括快取。不鼓勵在公共類別載入器路徑中廣泛放置類別,因為它:
- 破壞了可移植性
- Tomcat 和不同的 Web 應用程式之間的類別版本要求可能不同。
- 維護成為一個問題,屬於哪一類?
類別載入/快取/重新載入過程中有很多細則。如果這很重要,我的建議是閱讀有關類別載入的優秀章節專業 Apache Tomcat 6。
有人寫了一個壓縮版本這頁。