首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP/Servlet 性能優化七大核心技巧:從緩存到線程池全方位提升響應速度

     編輯:關於JSP

前言

J2EE 應用性能瓶頸多集中在 Web 層。本文梳理 7 個經過生產驗證的優化技巧,涵蓋初始化緩存、會話控制、壓縮傳輸、線程模型、包含機制、Bean 作用域、代碼微優化,助你構建高吞吐、低延遲的 Web 應用。

技巧 1:在 Servlet.init() 中緩存靜態資源

init() 僅在 Servlet 實例化後調用一次,適合載入昂貴資源:

public class ControllerServlet extends HttpServlet {
    private DataSource dataSource;  // 線程安全,單例

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        try {
            Context ctx = new InitialContext();
            dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDS");
        } catch (NamingException e) {
            throw new ServletException("DataSource lookup failed", e);
        }
    }

    protected DataSource getDataSource() { return dataSource; }
}

效果:避免每請求 JNDI 查找,降低延遲 ~1-5ms。

技巧 2:生產環境關閉自動重載

  • 開發階段:開啟自動重載(修改類/JSP 即時生效)。
  • 生產階段:必須關閉。類加載器輪詢文件修改時間戳會消耗大量 CPU/IO,且易導致類隔離衝突(同一類被不同 ClassLoader 加載兩份)。
  • Tomcat: Context reloadable="false" (默認)。

技巧 3:精準控制 HttpSession

策略做法收益
禁用無用 SessionJSP 頁面指令 <%@ page session="false" %>減少 Session 創建/序列化開銷
不存大對象僅存 ID/Token,大數據放 Redis/DB降低序列化體積與 GC 壓力
及時失效登出調用 session.invalidate()釋放內存,防囤積
縮短超時web.xml <session-timeout>15</session-timeout> (分鐘)減少併發 Session 數

技巧 4:啟用 GZIP 壓縮回應

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    String acceptEncoding = req.getHeader("Accept-Encoding");
    OutputStream out;
    if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
        resp.setHeader("Content-Encoding", "gzip");
        out = new GZIPOutputStream(resp.getOutputStream());
    } else {
        out = resp.getOutputStream();
    }
    // 後續寫入 out...
}
  • HTML/JSON/CSS/JS 通常壓縮率 70-90%。
  • 生產建議:在 Nginx/Apache/負載均衡層統一開啟,Servlet 碼無侵入。

技巧 5:拒絕 SingleThreadModel,擁抱線程池

  • SingleThreadModel 導致容器為每請求創建 Servlet 實例,**極度浪費內存/CPU**,Servlet 2.4 已棄用。
  • 容器默認為每請求分配線程,創建/銷燬開銷大。
  • 配置線程池 (Tomcat server.xml):
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
    maxThreads="200" minSpareThreads="25" maxIdleTime="60000" />
<Connector executor="tomcatThreadPool" port="8080" ... />

效果:線程復用,併發尖峰平滑處理,無創建風暴。

技巧 6:選擇正確的頁面包含機制

機制語法階段性能適用場景
靜態包含<%@ include file="fragment.jsp" %>編譯期合併為單一 Servlet**最快** (無額外請求/包裝)通用片段:頭部、底部、側欄、工具函數
動態包含<jsp:include page="dynamic.jsp" flush="true"/>請求期轉發包含較慢 (額外 request/response 包裝)高度動態、需獨立編譯、條件包含

原則:能靜態包含就靜態包含。

技巧 7:精準設置 <jsp:useBean> 作用域

<jsp:useBean id="user" class="com.example.User" scope="request"/>
scope生命週期適用場景
page當前頁面渲染期間 (默認)臨時工具對象、格式化輔助
request一次 HTTP 請求表單數據封裝、請求級緩存
session用戶會話期間登入用戶信息、購物車
application整個 Web 應用生命週期全局配置、靜態字典、共享緩存

誤區:請求級數據用 session 導致內存洩漏、垃圾對象堆積、GC 頻繁。

附錄:代碼級微優化清單

  1. 字符串拼接用 StringBuilder 替代 + (循環/高頻)。
  2. 日誌用 Log4j2/SLF4J 異步輸出,禁用 System.out.println (同步阻塞 IO)。
  3. 輸出二進制流用 ServletOutputStream,文本用 PrintWriter (避免雙向轉換)。
  4. JDBC 用 PreparedStatement + 批處理 + 連接池。
  5. 集合初始化指定容量 new ArrayList<>(expectedSize)。

總結

性能優化無銀彈,但上述 7 技巧覆蓋了 Web 層 80%+ 的常見瓶頸。原則:**緩存靜態、壓縮傳輸、縮小作用域、復用線程、靜態包含、異步日誌**。配合 APM (Pinpoint/SkyWalking) 持續觀測,方能行穩致遠。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved