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

Java 效能優化實戰寶典:從基礎到 J2EE 與 GUI 全方位指南

     編輯:Java 相關知識

一、通用優化技巧

1.1 善用 clone() 替代 new 建立實例

實作 Cloneable 並呼叫 clone() 可跳過建構子鏈調用。配合 Factory Pattern 使用:

// 傳統 Factory
public static Credit getNewCredit() { return new Credit(); }

// 優化:原型模式
private static final Credit PROTOTYPE = new Credit();
public static Credit getNewCredit() { return (Credit) PROTOTYPE.clone(); }

陣列複製同理適用 clone()。

1.2 採用非阻塞 I/O (NIO)

JDK 1.4+ 引入 java.nio,以 Channel + Buffer 模型取代傳統「一請求一執行緒」模式,大幅降低執行緒建立/切換開銷,適合高併發場景(Web Server、即時行情系統)。

1.3 審慎使用例外

拋出例外需建立物件、擷取堆疊追蹤(native 呼叫 fillInStackTrace())、調整呼叫堆疊,開銷極大。原則:僅用於真正的錯誤處理,絕不可用於控制流程(如用 try-catch 替代 if-else)。

1.4 避免重複初始化欄位

Java 自動將欄位初始化為預設值(null/0/false)。繼承鏈中每個建構子皆會隱含呼叫 super(),導致多次初始化。若在建構子中再次顯式賦值相同預設值,屬純粹浪費。

1.5 盡量宣告 class 為 final

final 類別不可被繼承,所有方法隱含 final,編譯器可進行內聯優化,平均提升 50% 效能(視編譯器實作而定)。String 即為經典範例。

1.6 優先使用區域變數

參數與區域變數存放於 Stack(棧),存取速度遠快於 Heap(堆)上的靜態/實例欄位。JIT 編譯器更易對區域變數進行暫存器分配等進階優化。

1.7 以位移運算取代乘除法

val * 8 → val << 3、val / 2 → val >> 1。位移指令單週期完成,乘除法需多週期。注意:需加註解,否則損害可讀性。

二、J2EE 專屬優化

2.1 JSP 快取標籤

WebLogic、OpenSymphony 支援片段/頁面級快取。購物車、首頁等「讀多寫少」頁面效果顯著;邏輯複雜頁面獲益較大。

2.2 必須透過 Session Bean 存取 Entity Bean

直接遠端呼叫 Entity Bean 的每個 getter 都是一次 RMI 呼叫。Session Bean 為本地介面,可將資料聚合後一次傳回,並改善事務管理(僅在事務邊界提交,避免頻繁「載入-讀取」)。若 Entity Bean 僅做 CRUD,改用 Session Bean 內部直連 JDBC 效能更佳。

2.3 選擇正確的 Include 機制

  • <%@ include file="..." %>:編譯期靜態包含,效能最佳,適用靜態頁首/頁尾。
  • <jsp:include page="..." />:執行期動態包含,靈活但有開銷,僅用於內容頻繁變動或請求前無法確定的資源。

2.4 部署描述符設定 read-only

Entity Bean 的 getter 標記 read-only="true",容器可跳過 ejbStore(),減少資料庫寫入。

2.5 快取 EJB Home 介面

JNDI 查詢 EJBHome 開銷大,應放在 Servlet.init() 或實作 EJBHomeCache (Singleton) 複用。

2.6 實作 Local Interface (EJB 2.0+)

避免 RMI 序列化/網路傳輸開銷。限制:Client 與 Bean 必須同一 JVM、參數傳遞改為 by-reference、不拋 RemoteException、Reference 不可序列化。

2.7 主鍵生成策略

  • DB 自增/Sequence:簡單但綁定特定資料庫。
  • Entity Bean 自增:需可序列化事務,效能差。
  • NTP 時間:多 CPU 環境下同毫秒可能衝突。
  • GUID:需 JNI 取 MAC,綁定 OS。
  • 推薦:RMI + JNDI 集中式產生器(單例模式 + 原子長整數遞增)。

2.8 及時失效 Session

大量 Session 導致記憶體壓力、GC 停頓、甚至 Swap。HttpSession.invalidate() 應在登出頁主動呼叫;設定 setMaxInactiveInterval() 縮短逾時。

2.9 關閉不需要的 Session

純靜態頁面加入 <%@ page session="false" %>,避免自動建立 Session。

2.10 Servlet 記憶體洩漏防範

  • 實作 HttpSessionBindingListener,在 valueUnbound() 釋放資源。
  • 縮短 Session 逾時或主動失效。

2.11 HTTP Keep-Ale:雙面刃

靜態資源站點受益;高負載動態站點會佔用連線資源,導致執行緒耗盡。Web Server 與 App Server 同機時影響更大。

2.12 JDBC 與 Unicode

資料庫欄位用 Unicode (Code Page 13488) 儲存字元,JDBC 驅動免轉碼。代價:儲存空間翻倍;若其他非 Unicode 應用共用 DB,驅動仍需轉碼。

2.13 JDBC 批量擷取

預設每次 32 列。大結果集設 setFetchSize(512) 可大幅減少網路往返。限制:可捲動游標或 FOR UPDATE 查詢無效。

2.14 記憶體資料庫替代方案

購物車/目錄等 Session 級資料量大時,改用 In-Memory DB (如 TimesTen):操作全在記憶體、無複雜緩衝演算法、簡單鎖機制、速度極快。資料允許暫時性丟失(重啟後重建)。

三、GUI (AWT/Swing) 優化

3.1 JAR 壓縮類別檔案

<applet archive="app.jar" ...> 減少下載體積、加快啟動。

3.2 Applet 預載入器

小型 PreLoader Applet 顯示「載入中...」,背景執行緒載入主 Applet,再 setStub()、add() 替換顯示。編譯後 < 2KB,秒開。

3.3 繪圖前預載圖片

實作 ImageObserver.imageUpdate(),ALLBITS 就緒時呼叫 repaint(),避免畫面閃爍與不完整顯示。

3.4 覆寫 update() 減少閃爍

// 基礎版:不清屏直接畫
public void update(Graphics g) { paint(g); }

// 進階版:只重繪變動區域
public void update(Graphics g) {
    g.clipRect(x, y, w, h);
    paint(g);
}

3.5 延遲重繪合併事件

視窗調整/捲動產生大量重繪事件。引入「幾毫秒延遲」:收到新事件取消當前重繪、只處理最新事件。耗時操作啟動工作執行緒,避免凍結 EDT (Event Dispatch Thread)。

3.6 雙緩衝繪圖

離屏緩衝繪圖完成後一次 drawImage 到螢幕,低優先級執行緒繪圖,主執行緒保持響應。

3.7 使用 BufferedImage

JDK 1.2+ 軟體繪圖管線核心,可訪問像素緩衝,支援 RGB/灰階,大幅提升 2D 繪圖效能。

3.8 使用 VolatileImage 利用硬體加速

透過 createVolatileImage() 建立顯存圖片,利用 GPU 矩形填充等加速。需定期呼叫 validate() 檢查內容是否遺失 (contentsLost()) 並重繪。

3.9 開啟 Window Blitting 加速捲動

setScrollMode(int mode) 啟用作業系統級 Blitting(螢幕緩衝區直接位移),僅重繪新露出區域。前台捲動必定受益;後台捲動可能降級。

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