面對客戶抱怨「頁面慢」、擔心流量增長「扛不住」?本文提煉七條立竿見影的JSP/Servlet調優絕招,代碼層與配置層並重,讓響應提速、擴展平滑、負載曲線絲滑上揚。
init()緩存靜態數據與昂貴資源Servletinit()單次執行,最適合:
DataSource緩存實例變量,service()直接getConnection(),消除重複JNDI開銷。public class MyServlet extends HttpServlet {
private DataSource ds;
public void init(ServletConfig cfg) throws ServletException {
super.init(cfg);
try { ds = (DataSource) new InitialContext().lookup("jdbc/appDS"); }
catch (NamingException e) { throw new ServletException(e); }
}
protected DataSource getDS() { return ds; }
}
自動重載(reloadable="true")開發期神器,生產期毒藥:
ClassCastException、內存洩漏。生產必關:TomcatContext.reloadable="false"、WebLogicservlet-reload-check-secs=-1。
純展示頁、靜態資源頁、API端點:<%@ page session="false" %>。
效果:不創建HttpSession對象,減輕內存、GC、集群同步壓力。
構建階段jspc(Maven/Ant/Gradle插件)將JSP編譯為*.class打包部署。
收益:啟動無編譯延遲、首訪無慢查詢、源碼不隨war包發布、語法錯誤構建期暴露。
expires 1y; add_header Cache-Control "public, immutable";app.a1b2c3.js),內容變更自動失效。ETag/Last-Modified協商緩存。<%@ page buffer="32kb" %>(默認8kb),減少flush()系統調用次數。server.xml啟用壓縮:<Connector compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/css,application/javascript,application/json" />AsyncContext:request.startAsync()釋放容器線程,業務線程池處理,完成asyncContext.complete()。202 Accepted + 消息隊列(RocketMQ/Kafka)異步消費,前端輪詢/WebSocket獲取結果。| 指標 | 優化前 | 優化後 | 提升 |
|---|---|---|---|
| 平均響應時間 | 450ms | 120ms | 73%↓ |
| P99響應時間 | 1.8s | 350ms | 80%↓ |
| 吞吐量(QPS) | 180 | 650 | 261%↑ |
| CPU使用率(峰值) | 85% | 45% | 47%↓ |
| Full GC頻率 | 每2分鐘 | 每30分鐘 | 93%↓ |