兩種優化路徑:① 優化代碼 ② 改變設計。選擇 ②:良好設計天然減少代碼量、對象創建、方法調用,性能收益遠超微優化。
Java 常見問題:濫用 new、忽視庫函數、產生大量短命對象 → 年輕代 GC 頻繁、分配速度下降、STW 增長。
String name = new String("HuangWeiFeng");
System.out.println(name + " is my name");
字節碼級分析:創建 5 個對象 (String×3, StringBuffer×1, char[]×1),調用構造器、append、toString、println。
StringBuffer name = new StringBuffer("HuangWeiFeng");
System.out.println(name.append(" is my name.").toString());
僅創建 4 個對象,**循環場景下性能提升 2 倍以上** (原文實測)。
| 代碼段 | 對象數 | 相對耗時 |
|---|---|---|
String s=""; s+="a"; s+="b"; | 8 | 100% (基準) |
StringBuffer sb=new StringBuffer(); sb.append("a").append("b").toString(); | 4 | ~50% |
static final 類常量、單例、緩存實例,避免重複創建。int vs Integer,避免自動裝箱/拆箱開銷 (特別在循環、集合操作中)。new ArrayList(1000)、new HashMap(512),減少擴容複製。finalize() 不可控、延遲 GC、性能殺手,用 try-with-resources/Cleaner 替代。| 設計決策 | 性能影響 | 說明 |
|---|---|---|
| 算法複雜度優化 | O(n²)→O(n log n) | 數量級飛躍,遠超任何微優化 | 緩存策略 (多級、預熱、失效) | 消除重複計算/IO | 業務級收益,命中率 90%+ 即數量級提升 |
| 異步化/批次化 | 串行→並行、單筆→批次 | 吞吐量線性擴展,延遲可控 |
| 數據結構選型 | ArrayList vs LinkedList, HashMap vs TreeMap | 訪問模式匹配,避免誤用導致 O(n) 退化 |
| 鎖粒度/無鎖設計 | 減少爭用、CAS、ThreadLocal | 高併發擴展性關鍵 |
-Xlog:gc* + GCViewer / GCEasy,觀察分配速率、提升率、STW 分佈。Java 性能優化,**設計優於代碼,代碼優於配置,配置優於祈禱**。建立「對象分配意識」、掌握「StringBuilder/集合預分配/靜態常量」三板斧,再配合架構級緩存/異步/算法優化,即可應對 95% 性能挑戰。