效能調優需從開發習慣、容器參數、架構設計三維度入手。本文整理七大經實戰驗證的優化策略,助你構建高吞吐、平滑擴展的 JSP 應用。
Servlet init() 僅執行一次,適合建立 JDBC 連線池、JNDI DataSource、載入配置檔、初始化快取資料。
private DataSource dataSource;
public void init(ServletConfig config) {
try { dataSource = (DataSource) new InitialContext().lookup("jdbc/appDS"); }
catch (NamingException e) { throw new ServletException(e); }
}
開發便利的 auto-reload 導致 ClassLoader 持續掃描、類重複載入、記憶體洩漏。Tomcat <Context reloadable="false">,其他容器同理關閉熱部署掃描。
<%@ page session="false" %>session.invalidate()web.xml <session-timeout>15</session-timeout>文字內容可減少 70%+ 傳輸量。建議在 Nginx/Apache/Tomcat 容器層面統一開啟:
<Connector compression="on"
compressableMimeType="text/html,text/xml,text/plain,text/css,application/json,application/javascript"
compressionMinSize="2048"/>
預設逐請求建立/銷毀執行緒開銷大。Tomcat 定義 Executor:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="200" minSpareThreads="25" maxIdleTime="60000"/>
<Connector executor="tomcatThreadPool" ... />
實現平滑擴展曲線,避免突發流量導致執行緒風暴。
| 指令 | 語法 | 階段 | 效能 | 適用 |
|---|---|---|---|---|
| 靜態包含 | <%@ include file="x.jsp" %> | 編譯期 | 高 | 共用頁首尾、靜態片段 |
| 動態包含 | <jsp:include page="x.jsp" flush="true"/> | 請求期 | 低 | 動態內容、條件式包含 |
原則:能靜態包含就靜態包含。
<jsp:useBean id="config" scope="application" class="com.AppConfig"/>
page:請求結束銷毀(預設)request:轉發鏈共享session:跨請求用戶狀態application:全域單例(配置、快取)錯誤用法:請求級資料設為 session → 記憶體洩漏、GC 壓力。
+ 產生大量暫時物件。ServletOutputStream,文字用 PrintWriter,避免不必要編碼轉換。掌握平台特性,從程式碼習慣、容器參數、架構選型三維度著手,才能寫出真正高效的 J2EE 應用。