JSP/Servlet 應用性能優化是系統上線前的必修課。本文總結七大實戰技巧,涵蓋初始化緩存、類加載、會話管理、輸出壓縮等關鍵領域。
Servlet 生命周期中 init() 僅執行一次,是緩存「建立一次、多次復用」資源的最佳位置。典型場景:JDBC 連接池、JNDI DataSource 查找、配置文件解析。
public class ControllerServlet extends HttpServlet {
private javax.sql.DataSource testDS = null;
public void init(ServletConfig config) throws ServletException {
super.init(config);
try {
Context ctx = new InitialContext();
testDS = (javax.sql.DataSource) ctx.lookup("jdbc/testDS");
} catch (NamingException ne) { ne.printStackTrace(); }
}
public javax.sql.DataSource getTestDS() { return testDS; }
}
效果:避免每次請求重複 JNDI 查找,顯著降低延遲。
開發階段自動重載(auto-reloading)便於熱部署,但生產環境會導致類加載器頻繁掃描、重新加載類,造成 CPU 與內存壓力。務必在 web.xml 或容器配置中關閉。
Session 依賴序列化機制,不當使用會拖垮性能:
<%@ page session="false" %>session.invalidate() 主動釋放<session-timeout>針對支援 Accept-Encoding: gzip 的瀏覽器,壓縮 HTML 輸出可大幅減少傳輸體積:
String encoding = request.getHeader("Accept-Encoding");
OutputStream out;
if (encoding != null && encoding.indexOf("gzip") != -1) {
response.setHeader("Content-Encoding", "gzip");
out = new GZIPOutputStream(response.getOutputStream());
} else {
out = response.getOutputStream();
}
現代補充:現在多由 Nginx/Apache 等反向代理層統一處理壓縮,應用層無需重複實現。
原文還包含:使用 StringBuffer 替代字符串拼接、合理設置緩存頭(Cache-Control/Expires)、數據庫連接池調優(最大/最小連接數、驗證查詢)等,均為經典優化手段。
總結:性能優化無銀彈,需結合壓測定位瓶頸。上述七招解決了 80% 以上常見 JSP 性能問題,建議逐項排查落地。