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

35 條 Java 代碼性能優化實戰總結:從語法細節到 JVM 層面

     編輯:Java 相關知識

代碼優化非一蹴而就,而是無數微小改進的累積。本文精選 35 條經過生產驗證的 Java 優化建議,涵蓋語法層面、集合選型、並發控制、I/O 處理、JVM 調優等維度,附原理分析與代碼對比,助你寫出高效、穩健的 Java 代碼。

語法與基礎優化(1-8)

  1. 善用 final:類/方法/變數加 final 利於 JIT 內聯優化,性能可提升 ~50%。
  2. 重用對象:字串拼接用 StringBuilder 避免產生大量臨時 String 對象,減輕 GC 壓力。
  3. 優先局部變數:棧分配速度快、隨棧幀自動釋放,無需 GC;實例/靜態變數在堆,訪問較慢。
  4. 及時關閉流:資料庫連接、I/O 流、Socket 用完即關,防止句柄洩漏導致 OOM。
  5. 避免重複計算:循環條件緩存 list.size() → for (int i=0, len=list.size(); i<len; i++)。
  6. 懶加載:僅在真正需要時創建對象,if (need) { String s = heavy(); }。
  7. 慎用異常:異常構造填充堆棧資訊極慢,僅用於錯誤處理,不可控制業務流程。
  8. try-catch 勿放循環內:移至最外層,除非逐次捕獲有明確語義。

集合與資料結構選型(9-14)

  1. 預估容量預分配:new ArrayList(1000)、new HashMap(1024) 避免擴容複製;HashMap 容量建議 2 的 N 次冪。
  2. 大量複製用 System.arraycopy:原生優化,比手寫循環快數倍。
  3. 乘除用位移:val * 8 → val << 3、val / 2 → val >> 1,底層指令級優化(需加註釋)。
  4. 循環外聲明引用:Object obj = null; for(...) obj = new Object(); 避免佔用多個引用槽。
  5. 確定大小優先陣列:int[] 比 ArrayList 輕量、訪問更快;不確定大小再用 List。
  6. 非線程安全首選:HashMap/ArrayList/StringBuilder 替代 Hashtable/Vector/StringBuffer,避免同步開銷。

記憶體與引用管理(15-18)

  1. 勿 public static final 陣列:引用不可變但元素可改,存在安全隱患;改用 Collections.unmodifiableList 或防禦性複製。
  2. 恰當使用單例:控制資源併發訪問、限制實例數量、跨線程共享數據三大場景適用;雙重檢查鎖或靜態內部類實現。
  3. 避免濫用靜態變數:static 引用導致對象常駐堆,隨類生命週期釋放,易造成記憶體洩漏。
  4. 及時清理 Session:Web 應用中調用 session.invalidate() 釋放不活躍會話,防止序列化風暴與堆積。

遍歷與迭代優化(19-20)

  1. RandomAccess 列表用 for 索引:ArrayList 實現 RandomAccess,for (int i=0; i<size; i++) 比 for-each(底層 Iterator)快;LinkedList 反之。
  2. 同步代碼塊替代同步方法:縮小鎖範圍,僅鎖保護共享資源的關鍵區段,提升併發度。

編碼規範與防錯技巧(21-30)

  1. 常量 static final 大寫:編譯期進入常量池,避免運行期計算;命名區分度高。
  2. 刪除無用代碼/導入:IDE 黃色警告 The value... is not used 即刻清理。
  3. 運行期避免反射:Method.invoke 慢 10-100 倍;啟動階段反射預熱緩存 Method 對象。
  4. 連接池/線程池複用:避免頻繁創建銷毀連接與線程,HikariCP / ThreadPoolExecutor 標配。
  5. 帶緩衝 I/O:BufferedReader/Writer/InputStream/OutputStream 大幅降低系統調用次數。
  6. 場景化選 List 實現:順序插入/隨機訪問 → ArrayList;頻繁頭尾增刪 → LinkedList。
  7. public 方法參數 ≤ 3-4 個:超過封裝為 DTO/VO,符合 OO 思想並降低調用出錯率。
  8. 字串比較常量在前:"const".equals(str) 避免 NullPointerException。
  9. 習慣用 if (i == 1):Java 無 C/C++ 賦值誤判風險,可讀性優先。
  10. 陣列勿直接 toString():輸出 [I@hashcode;用 Arrays.toString() 或手寫格式化。

進階避坑與微優化(31-35)

  1. 基本型別下溢/上溢強轉不可取:long → int 截斷高位得非預期值;業務邏輯驗證範圍後再轉。
  2. 公共集合及時 remove:長期持有引用阻礙 GC,造成記憶體洩漏。
  3. 基本型別轉字串:toString() > String.valueOf() > +"":Integer.toString() 直達;String.valueOf 多空判;+"" 經 StringBuilder 最慢。
  4. 遍歷 Map 用 entrySet():for (Entry<K,V> e : map.entrySet()) 單次查找拿到 Key+Value,避免二次 get(key)。
  5. 資源關閉分開 try-catch:try { a.close(); } catch... try { b.close(); } catch... 確保每個資源都被釋放,防止首個關閉拋異常導致後續資源洩漏。

總結:優化的核心心法

優化非盲目套用清單,而是理解底層原理(JIT、GC、記憶體模型、CPU 緩存),在性能熱點(Profiling 定位)針對性改進。過早優化是萬惡之源;無度量不優化。

建議工作流:JMH 基準測試 → 確定熱點 → 針對性優化 → 回歸驗證。養成「寫代碼時順手應用最佳實踐」的肌肉記憶,才是長久之計。

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