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

Servlet/JSP 效能優化八大核心技術與最佳實踐指南

     編輯:Java 相關知識

Web 應用效能直接影響用戶體驗與系統吞吐。本文提煉八大 Servlet/JSP 效能優化核心技術,涵蓋初始化快取、會話管理、壓縮傳輸、執行緒模型、靜態包含、作用域選擇、字符串處理、I/O 流選型,並補充現代框架層面優化建議。

技術一:init() 階段快取昂貴資源

init(ServletConfig) 僅執行一次,適合初始化:

  • JNDI 查找 DataSource、ConnectionFactory
  • 載入配置文件、模板引擎、靜態資源映射
  • 建立線程池、HTTP 客戶端、快取管理器

public class ControllerServlet extends HttpServlet {
    private DataSource dataSource;
    private TemplateEngine templateEngine;
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        try {
            Context ctx = new InitialContext();
            dataSource = (DataSource) ctx.lookup("jdbc/appDS");
            templateEngine = new TemplateEngine(config.getServletContext());
        } catch (NamingException e) {
            throw new ServletException("資源初始化失敗", e);
        }
    }
    
    // 業務方法直接復用
    protected DataSource getDataSource() { return dataSource; }
}

技術二:生產環境禁用自動重載

  • 開發階段:web.xml `` `` + IDE 熱部署
  • 生產階段:關閉 Tomcat `reloadable="false"`、關閉 JSP `development=false`、jspServlet 參數 `modificationTestInterval=0`
  • 效能影響:類重載導致 Metaspace 壓力、類卸載/重載開銷、靜態狀態重置風險

技術三:精準控制 HttpSession

策略實現效能收益
JSP 頁面不自動建立 Session`<%@ page session="false" %>`避免大量匿名訪問產生無效 Session
不存放大對象圖僅存 ID/Token,詳情查 Redis/DB減少序列化開銷、Session 體積、複寫流量
及時銷毀`session.invalidate()` 登出/超時釋放記憶體、減少 GC 壓力
設定合理超時`web.xml` `15` (分鐘)平衡用戶體驗與資源佔用
無狀態化趨勢JWT Token + Redis 分散式 Session支援水平擴展、消除 Session 親和性

技術四:啟用 GZIP 壓縮傳輸


// Servlet 過濾器統一處理 (推薦)
public class GzipFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        
        String acceptEncoding = request.getHeader("Accept-Encoding");
        if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
            response.setHeader("Content-Encoding", "gzip");
            try (GZIPResponseWrapper wrapper = new GZIPResponseWrapper(response)) {
                chain.doFilter(request, wrapper);
                wrapper.finish(); // 關閉流觸發壓縮
            }
        } else {
            chain.doFilter(request, response);
        }
    }
}

// 響應包裝器
class GZIPResponseWrapper extends HttpServletResponseWrapper {
    private GZIPOutputStream gzipOut;
    // 重寫 getOutputStream()/getWriter() 返回壓縮流
}

現代做法:Nginx/Apache 反向代理層開啟 `gzip on;`、Spring Boot `server.compression.enabled=true`、CDN 邊緣壓縮。

技術五:拒絕 SingleThreadModel

  • 已棄用 (Servlet 2.4)、移除 (Servlet 3.0+)
  • 機制:每請求建立實例 → 極大記憶體/GC 壓力、無法共享快取
  • 替代:無狀態 Servlet + 線程安全工具類 (ThreadLocal、Atomic*、ConcurrentHashMap)

技術六:配置執行緒池優化併發處理

  • Tomcat `` / `` `maxThreads`、`minSpareThreads`、`acceptCount`
  • 公式估算:`maxThreads = (CPU 核心數 * (1 + 平均等待時間/平均計算時間)) * 目標併發係數`
  • 監控指標:`currentThreadCount`、`currentThreadsBusy`、佇列積壓
  • 異步 Servlet (Servlet 3.0+):`@WebServlet(asyncSupported=true)` + `startAsync()` 釋放容器線程處理長耗時 I/O

技術七:選擇正確包含機制

機制語法階段適用場景
靜態包含 (指令)`<%@ include file="header.jsp" %>`編譯期合併為單一 Servlet極少變動的佈局片段 (header/footer)
動態包含 (動作)``請求期獨立編譯、合併輸出頻繁變動、條件化、參數化片段

效能:靜態包含零運行期開銷;動態包含每請求額外 `include()` 呼叫開銷。

技術八:useBean 精準選擇作用域


   // 請求級,最常用
  // 用戶級,購物車等
 // 全域單例
     // 頁面級,極少用

原則:最小作用域原則。請求級數據用 `request`,避免 `session` 佔用記憶體導致 GC 壓力與叢集複寫開銷。

補充:現代框架層面優化清單

  1. 字符串拼接:`StringBuilder` / `String.join` / `Collectors.joining`,避免 `+` 產生大量臨時對象
  2. 日誌輸出:SLF4J 佔位符 `{}` 避免字符串拼接,`isDebugEnabled()` 守衛,異步 Appender (Log4j2 Async/Logback Async)
  3. 資料庫交互:連線池 (HikariCP)、批次操作、FetchSize 優化、只選需要欄位、慢查詢監控
  4. 快取策略:多級快取 (Caffeine 本地 + Redis 分散式)、Cache-Aside 模式、快取穿透/擊穿/雪崩防護
  5. 靜態資源:版本化檔名、CDN、瀏覽器快取頭、壓縮 (Brotli/GZIP)、HTTP/2 多路複用
  6. 異步非阻塞:Spring WebFlux / CompletableFuture / Virtual Threads (JDK 21+) 處理高併發 I/O

總結

Servlet/JSP 優化核心在於:減少物件創建、降低鎖競爭、壓縮網路傳輸、精準控制生命週期、遷移至現代架構。傳統優化手段在 Spring Boot/Spring Cloud/微服務體系下仍具指導意義,但更應關注:分散式追蹤、熔斷限流、自動擴縮容、可觀測性三大支柱 (Metrics/Logs/Traces)。

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