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

Java 效能優化全攻略:通用、J2EE、GUI 三大維度 50+ 實戰技巧

     編輯:Java 相關知識

一、通用優化篇(適用所有 Java 應用)

1.1 避免 new 建立實例:用 clone() 或對象池


// 工廠模式優化前
public static Credit getNewCredit() { return new Credit(); }

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

clone() 跳過建構子鏈,效能提升明顯;陣列複製同理用 Arrays.copyOf/System.arraycopy。

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

JDK 1.4+ java.nio:Selector + Channel + Buffer 替代「一請求一執行緒」模型,大幅降低執行緒開銷,支援萬級併發(Netty 底層基石)。

1.3 慎用異常:僅用於真正錯誤,不用於流程控制

異常建立堆疊追蹤開銷極大(fillInStackTrace() native 呼叫)。禁用:用異常跳出循環、做驗證失敗返回。

1.4 避免重複初始化:信任 JVM 預設值

建構子鏈自動初始化:null/0/0.0/false。顯式賦相同值純屬多餘字節碼。

1.5 類/方法加 final:啟用內聯優化

final 類不可繼承,final 方法不可覆寫 → JIT 編譯器可激進內聯,平均提升 50% 呼叫效能(視編譯器實現)。

1.6 優先使用局部變數(棧分配)

參數、臨時變數在棧上,存取速度快於堆上的實例/靜態欄位;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:每個 getXxx() 都是 RMI 呼叫。Session Bean 本地封裝,組裝資料一次返回,減少網路往返;事務邊界也更清晰(僅在 Session Bean 方法結束提交)。

2.3 選擇正確的 Include 機制

指令時機適用場景
<%@ include file="..." %>編譯期靜態頁首/尾、版權聲明,效能最佳
<jsp:include page="..." />運行期動態內容、頻繁變化、請求前無法確定資源

2.4 部署描述符設置唯讀屬性

Entity Bean 僅讀操作事務標記 read-only="true",容器跳過 ejbStore(),減少資料庫寫入。

2.5 緩存 EJB Home 查找 (JNDI)

InitialContext.lookup() 開銷大。放在 Servlet.init() 或實作 EJBHomeCache (Singleton) 複用。

2.6 實作 Local Interface (EJB 2.0+)

  • 避免 RMI/IIOP 序列化、網路開銷,參數傳引用而非傳值。
  • 限制:Client 與 Bean 必須同 JVM;不可序列化;異常體系改為 XxxLocalException。

2.7 主鍵生成策略選型

策略優點缺點
DB Identity/Sequence簡單可靠可移植性差
Entity Bean 自增獨立需可序列化事務、效能差
UUID/GUID全域唯一、去中心化長度長、索引效能較差
RMI + JNDI 集中發號器可移植、高效單點故障風險(需集群化)

2.8~2.14 關鍵速覽

  • 及時 invalidate Session:防止記憶體洩漏、序列化風暴。
  • 無狀態頁面關閉 Session:<%@ page session="false" %>。
  • Servlet 記憶體洩漏:實作 HttpSessionBindingListener 清理、縮短逾時時間。
  • HTTP Keep-Alive 權衡:靜態資源開啟,重負載動態應用謹慎(佔用連接埠/執行緒)。
  • JDBC Unicode 儲存:避免驅動程式轉碼開銷,但空間翻倍。
  • JDBC 批量抓取:setFetchSize(512) 減少資料庫往返(預設 32 行)。
  • 記憶體資料庫:TimesTen 等 In-Memory DB 替代關聯式 DB 做購物車/目錄,避免磁盤 I/O 瓶頸。

三、GUI 客戶端優化篇

3.1 JAR 壓縮部署:減少下載體積、加速 Applet 啟動

<applet archive="app.jar" ...>

3.2 Applet 預載器:小體積 PreLoader 顯示「載入中」,背景下載主 Applet

實作 AppletStub、Runnable,setStub() 傳遞 codebase,validate() 刷新顯示。

3.3 圖片預載入:ImageObserver + imageUpdate() 非阻塞載入

避免 UI 凍結;ALLBITS 觸發 repaint(),ERROR/ABORT 顯示佔位符。

3.4 覆蓋 update() 避免閃爍

public void update(Graphics g) { paint(g); } // 取消預設 clearRect
// 進階:只重繪髒區域 g.clipRect(x,y,w,h);

3.5 延遲重繪:合併高頻 repaint 事件

引入 e_queue + 時間窗口(如 10ms),只處理最後一個事件;耗時操作另開 Worker 執行緒。

3.6 雙緩衝/VolatileImage/BufferedImage

  • 雙緩衝:離屏繪圖 → 一次性 drawImage,低優先級繪圖執行緒。
  • BufferedImage:可訪問像素緩衝區,RGB/灰階,軟渲染基石。
  • VolatileImage:利用 GPU 硬體加速(矩形填充等),內容可能丟失需 validate()/contentsLost() 檢查。

3.7 Window Blitting:滾動優化

setScrollMode() 啟用 OS 級 Blitting(Win32 GDI、X11、MacOS 支援),只重繪新露出區域,前台滾動顯著加速。

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