系統性優化:減小體積、提升效率、防止洩漏
Java 效能瓶頸 90% 來自代碼而非語言本身。本文匯總 29 條實戰優化規則,涵蓋對象創建、集合選型、循環優化、異常處理、JDBC、Servlet、JSP 等全棧場景。
核心優化分類
對象與內存管理
- final 修飾類:不可繼承,方法隱式 final,JIT 可內聯,效能提升 ~50%
- 重用對象:尤其 String 拼接用 StringBuilder,減少 GC 壓力
- 優先局部變量:棧分配,速度快於堆上的靜態/實例變量
- 避免重複初始化:構造鏈自動初始化,顯式賦值 0/null 累贅
- 及時置空無用引用:幫助 GC 更早回收,防洩漏
- 慎用異常控制流程:異常創建棧追蹤開銷大,僅用於錯誤處理
- try-catch 勿放循環內:提至最外層
集合與數據結構選型
- StringBuilder 初始化容量:避免擴容複製(默認 16,擴容 2n+2)
- Vector/ArrayList 預設容量:避免頻繁擴容;Vector 同步開銷大,非多線程首選 ArrayList
- Vector 刪除策略:刪尾部 O(1) ≫ 刪頭部 O(n);清空用
removeAllElements()
- 索引緩存:
for (int i=0, n=list.size(); i<n; i++) 避免重複調用 size()
- 大量數據複製用 System.arraycopy():原生優化
- 優先 HashMap/ArrayList:非線程安全場景避免 Hashtable/Vector 同步開銷
- HashMap 遍歷:
entrySet() 直接拿 Entry ≫ keySet() + get() 雙重查找
- 數組 vs ArrayList:定長首選數組(最高效),不定長用 ArrayList
數據庫與 I/O
- SQL 大寫:減輕 Oracle 解析器負擔
- JDBC fetchSize:大結果集調大塊大小(默認 32 行),減少網絡往返
- 流/連接用完即關:finally 塊釋放資源
Web 層優化
- JSP 禁用無用 Session:
<%@ page session="false" %>
- Session 監聽釋放資源:實現
HttpSessionBindingListener
- 設置 Session 失效時間:
setMaxInactiveInterval()
- 頁面片段/整頁緩存:利用容器或 OpenSymphony 緩存標簽
- include 指令 > include 動作:編譯期靜態包含效能優於運行期動態包含
- 及時 invalidate Session:避免序列化到磁盤開銷
微優化技巧
- 乘除法用位移:
val * 8 → val << 3,val / 2 → val >> 1
- clone() 替代 new:避免構造鏈調用,工廠模式適用
- final/static 修飾常量:編譯期內聯
- Buffered 流包裝:減少系統調用
編譯期壓縮 Class 文件體積
javac -O:移除行號、內聯 private/static/final 小方法
- 提取公共代碼、長名稱混淆(ProGuard)、大數組改字符串存儲運行期解析、日期存 long、常量提至接口
養成優化習慣,代碼自然快、穩、省。