面對客戶抱怨回應緩慢、擔憂流量暴增撐爆系統?掌握這七大調優策略,讓 Servlet/JSP 回應飛快、擴展平滑、負載曲線優雅上揚。
init() 單次初始化快取靜態資料Servlet 生命週期僅呼叫一次 init(),適合建立 JDBC 連線池、載入配置檔、初始化昂貴物件。避免每請求重複 JNDI 查詢:
private DataSource ds;
public void init(ServletConfig cfg) {
Context ctx = new InitialContext();
ds = (DataSource) ctx.lookup("jdbc/testDS"); // 快取 DataSource
}
開發期便利的 auto-reloading 會讓 ClassLoader 不斷掃描類別變更,生產環境嚴重拖垮效能,務必關閉。
HttpSession<%@ page session="false" %>。invalidate() 釋放。瀏覽器支援 Accept-Encoding: gzip 時,以 GZIPOutputStream 包裝回應流,大幅縮減 HTML 傳輸體積:
String enc = req.getHeader("Accept-Encoding");
if (enc != null && enc.contains("gzip")) {
resp.setHeader("Content-Encoding", "gzip");
out = new GZIPOutputStream(resp.getOutputStream());
}
容器預設請求一執行緒,頻繁建立/銷毀成本高。配置核心/最大執行緒數,池化複用,負載曲線平滑上揚。
<%@ include %> 而非動態 <jsp:include>編譯期合併避免執行期請求轉發開銷,效能更優(除非需動態決定包含頁面)。
<jsp:useBean scope="page|request|session|application">。一次請求用完即棄請用 page/request,勿濫用 session 造成記憶體洩漏與 GC 壓力。
StringBuilder 替代 +,減少暫時物件。System.out.println()(同步 I/O 瓶頸),改用 Log4j/SLF4J 非同步日誌。ServletOutputStream,文字輸出用 PrintWriter,按需取捨。效能不在平台之爭,而在於你對平台特性的深度理解與針對性優化。