效能問題的典型徵兆
J2EE 系統效能下降最直觀的表現是網頁回應變慢。深入觀察通常會發現下列資源使用異常:
- 應用程式伺服器資源(CPU、執行緒、記憶體)
- JVM 堆積使用率與 GC 頻率
- 作業系統層級資源(磁碟 I/O、網路、交換空間)
- 資料庫連線池、查詢執行計畫、鎖競爭
- 網路活動:頻寬飽和、延遲過高、封包重傳
這些現象反映 J2EE 應用高度依賴外部資源,且運行在分層執行模型中。架構師必須深入理解 JVM、應用伺服器與底層硬體的交互關係。
核心調優策略
1. JVM 堆積與垃圾回收配置
以 Sun HotSpot JVM 為例,堆積分為新生代、老年代、永久代。關鍵參數:
- 最大堆積 (-Xmx):小於實體記憶體,預留 OS 與其他程序空間;過大會導致 Full GC 停頓時間過長。
- 初始堆積 (-Xms):建議設為最大值(避免動態擴縮)或最大值的 1/2~1/4。
- 新生代大小 (-Xmn):Sun 建議設為最大堆積的 1/3。
GC 演算法選擇(JDK 1.4.1+):
- 平行 GC (Parallel GC):新生代多執行緒回收,利用多核心縮短停頓,適用於批次/高吞吐系統。
- 並發標記清除 (CMS):老年代以多階段並發回收,減少應用停頓,適用於低延遲需求系統。
2. 執行緒池調整
應用伺服器採用執行緒池處理請求與內部任務。調整原則:
- 依負載測試逐步調大,避免過大導致上下文切換開銷激增。
- 目標:充分利用 CPU 核心,但不使 CPU 過載。
- 針對不同任務類型(Web 請求、JMS、排程)配置獨立執行緒池。
3. EJB 容器配置
- 實例池大小:依並發需求調整,避免過大浪費記憶體;初始實例數不宜過高,否則啟動緩慢。
- 快取設定:快取大小與逾時需平衡命中率與記憶體佔用;避免長逾時導致閒置 Bean 佔用資源。
4. 資料庫連線池與 PreparedStatement 快取
- 依 SQL 類型(交易型 vs 批次型)劃分連線池,避免長時間批次作業佔用交易連線。
- 啟用
PreparedStatement 快取:重複執行相同 SQL(僅參數不同)時,可大幅降低解析/編譯開銷。
架構層面的效能設計原則
- 優先解決易見問題:資料庫存取效率低、過度遠端呼叫(RMI/EJB)。
- 再處理隱性問題:演算法累積效應、不必要的物件建立、序列化開銷。
- 善用廠商專屬優化參數:各應用伺服器(WebLogic、WebSphere、JBoss 等)提供非標準調優選項,需投入時間研究。
總結
效能調優是系統性工程,需從 JVM、應用伺服器、資料庫、網路多維度監控與分析。建立基準測試、持續觀測關鍵指標(回應時間、吞吐量、錯誤率、GC 停頓),方能精準定位瓶頸並驗證優化成效。