通過Servlet/JSP調優,可實現響應加速、擴展性增強、負載平滑增長。本文結合實戰代碼與容器配置,揭示七大關鍵優化點。
init()單次初始化緩存靜態數據Servlet生命週期中init()僅執行一次。典型場景:JDBC DataSource JNDI查找、配置載入、昂貴資源初始化。
public class ControllerServlet extends HttpServlet {
private DataSource testDS;
public void init(ServletConfig config) throws ServletException {
super.init(config);
try {
Context ctx = new InitialContext();
testDS = (DataSource) ctx.lookup("jdbc/testDS"); // 緩存DataSource
} catch (NamingException e) { e.printStackTrace(); }
}
public DataSource getTestDS() { return testDS; }
}
避免每次請求重複JNDI查找,大幅降低延遲。
開發期便利的auto-reload會導致類加載器頻繁掃描,生產環境必須關閉,釋放CPU/記憶體資源。
Session序列化/反序列化開銷大,四大原則:
<%@ page session="false" %>session.invalidate()主動釋放maxInactiveInterval,減少內存佔用針對支援Accept-Encoding: gzip的瀏覽器,動態壓縮HTML輸出:
String encoding = request.getHeader("Accept-Encoding");
OutputStream out;
if (encoding != null && encoding.contains("gzip")) {
response.setHeader("Content-Encoding", "gzip");
out = new GZIPOutputStream(response.getOutputStream());
} else {
out = response.getOutputStream();
}
劇減傳輸體積,提升弱網體驗。
容器預設每請求一線程,創建/銷毀開銷大。配置核心/最大線程數的線程池:啟動預熱核心線程,請求復用,峰值擴容至上限,負載曲線平滑,擴展性質變。
JSP兩種包含方式:
<%@ include file="fragment.jsp" %> → 編譯期合併,**性能更優**<jsp:include page="fragment.jsp" flush="true"/> → 運行時處理,靈活但有開銷靜態片段優先靜態包含。
<jsp:useBean id="name" scope="page|request|session|application" class="pkg.Class"/>
錯誤作用域導致對象殘留:請求級數據用session作用域將延遲至會話結束才釋放,增加GC壓力與內存佔用。原則:作用域最小化,用盡即銷毀。
+產生大量臨時對象System.out.println():同步I/O阻塞,改用Log4j異步日誌性能優化非平台之爭,乃對運行機制深度理解的體現。七大技巧覆蓋初始化、會話、傳輸、併發、編譯、作用域、編碼全鏈路,落地即見效。