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

J2EE 系統優化實戰心法:對象復用策略與循環性能深度優化

     編輯:Java 相關知識

系統優化貫穿需求、設計、編碼、維護全生命周期。本文結合實戰案例,從對象創建策略與循環編寫細節兩大高頻維度,提煉出具體可落地的優化條例。

條例一:盡量重用對象,避免創建過多短命對象

對象分類與選型決策

類型定義典型場景優/缺點選型建議
獨享對象單線程擁有,new 創建,線程結束 GC請求級 Bean、DTO、VO線程安全無需同步,但增加內存與 GC 壓力生命周期短、含可變狀態、不願共享
共享對象多線程共享,工廠/單例獲取配置屬性、工具類、DAO、Service節省內存,但需同步控制併發生命周期長、創建開銷大、狀態不可變或線程安全
不變對象無 setter,狀態構造後凍結String、常量對象、值對象天然線程安全、無副作用、可自由共享屬性少、創建開銷小、需廣泛共享
方法對象僅含方法無屬性Util、DAO、Service 統一入口可用 static 方法或單例,避免重複 new操作其他對象、無自身狀態、職責單一

決策流程

  1. 對象是否有可變狀態?→ 是 → 考慮獨享或線程安全共享
  2. 創建開銷大?→ 是 → 傾向共享/池化
  3. 是否需跨線程訪問?→ 是 → 必須共享並保證線程安全
  4. 狀態構造後是否不變?→ 是 → 採用不變對象模式
  5. 純行為無狀態?→ 採用方法對象(static/單例)

實戰案例

  • DateFormat:非線程安全,請勿作 static 共享 → 用 ThreadLocal 或每次 new
  • 數據庫連接:必須池化(DBCP/C3P0),而非頻繁創建銷毀
  • 大對象圖:構建耗時長 → 原型模式克隆或對象池

條例二:在循環處多下功夫,微優化積少成多

1. List 遍歷與刪除的正確姿勢

// 反向循環刪除:避免 ArrayList 每次 remove(0) 觸發大量 arraycopy
for (int i = list.size() - 1; i >= 0; i--) {
    if (shouldRemove(list.get(i))) list.remove(i);
}

原理:ArrayList.remove(index) 需 System.arraycopy 移動後續元素。從尾部刪除 numMoved=0,僅置 null,效率指數級優於正向刪除。

實測數據(10萬次循環):正向 ~6000ms,反向 ~15ms。

2. 大量增刪場景選 LinkedList

  • ArrayList:隨機訪問快,增刪慢(需移動/擴容)
  • LinkedList:雙向鏈表,增刪快(只改指針),隨機訪問慢
  • 策略:存儲幾萬對象且頻繁增刪 → LinkedList;純遍歷/隨機訪問 → ArrayList

3. 循環邊界條件與異常防禦

經典陷阱:讀取 InputStream 循環未檢查 read() == -1 導致死循環佔滿 CPU。

// 錯誤寫法
for (; totalRead < m_totalBytes; totalRead += readBytes) {
    readBytes = in.read(buf, totalRead, m_totalBytes - totalRead);
}

// 正確寫法
while (totalRead < m_totalBytes) {
    readBytes = in.read(buf, totalRead, m_totalBytes - totalRead);
    if (readBytes == -1) break; // 關鍵防禦
    totalRead += readBytes;
}

循環必須明確:規模、每次耗時、正常結束條件、異常結束條件(EOF、異常、超時)。

4. 循環不變量外提

// 差
for (int i=0; i

5. 集合批量操作優於單條循環

  • JDBC:addBatch() + executeBatch() 替換循環 executeUpdate()
  • 集合:addAll()、removeAll()、retainAll() 替換手動循環
  • Stream API (Java 8+):並行流處理大數據集

總結:優化是工程文化而非技巧堆砌

對象復用與循環優化看似微小,卻是高併發、大數據量系統性能的基石。建議:

  1. 代碼審查清單納入「對象創建是否必要」「循環是否有防禦」「集合選型是否合理」
  2. 壓測前用 Profiler (JProfiler/YourKit/VisualVM) 定位熱點,針對性優化
  3. 建立團隊《Java 編碼優化規約》,將經驗固化為標準

下一篇將探討數據庫訪問優化、緩存策略、鎖優化等進階主題。

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