同樣利用 init() 僅執行一次的特性,快取靜態資料或建立 JDBC 連線池(DataSource),避免重複 JNDI 查詢拖垮效能。程式碼範例參見前文(ID 47602)。
開發階段方便的自動重載,在正式環境會給類別載入器帶來沉重負擔。關閉此功能可顯著提升效能。
HTTP 無狀態,靠 HttpSession 維持客戶端狀態,但每次存取都涉及序列化,帶來額外開銷。優化建議:
<%@ page session="false" %>session.invalidate() 主動銷毀。支援 GZIP 的瀏覽器可大幅縮短 HTML 下載時間。程式碼片段:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
OutputStream out = null;
String encoding = request.getHeader("Accept-Encoding");
if (encoding != null && encoding.indexOf("gzip") != -1) {
response.setHeader("Content-Encoding", "gzip");
out = new GZIPOutputStream(response.getOutputStream());
} else if (encoding != null && encoding.indexOf("compress") != -1) {
response.setHeader("Content-Encoding", "compress");
out = new ZIPOutputStream(response.getOutputStream());
} else {
out = response.getOutputStream();
}
// ... 後續輸出邏輯
}
預設每請求建立一條執行緒,建立/銷毀成本高。配置執行緒池(設定最小/最大執行緒數),請求至從池取得執行緒,處理完歸還,負載曲線更平滑,擴展性更強。
JSP 有兩種包含方式:<%@ include file="..." %>(編譯期靜態包含)與 <jsp:include page="..." />(執行期動態包含)。實測前者系統效能較高。
<jsp:useBean scope="page|request|session|application" /> 的 scope 決定 Bean 存活範圍。若僅需請求範圍卻設為 session,會造成記憶體浪費與 GC 壓力。務必依實際需求選擇最小範圍,任務結束盡快清理。
+ 產生大量暫時物件。效能優化不在平台之爭,而在於深入理解平台特性並對症下藥。掌握上述技巧,可從根本上提升 J2EE 應用效能。