實作 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()。
JDK 1.4+ 引入 java.nio,以 Channel + Buffer 模型取代傳統「一請求一執行緒」模式,大幅降低執行緒建立/切換開銷,適合高併發場景(Web Server、即時行情系統)。
拋出例外需建立物件、擷取堆疊追蹤(native 呼叫 fillInStackTrace())、調整呼叫堆疊,開銷極大。原則:僅用於真正的錯誤處理,絕不可用於控制流程(如用 try-catch 替代 if-else)。
Java 自動將欄位初始化為預設值(null/0/false)。繼承鏈中每個建構子皆會隱含呼叫 super(),導致多次初始化。若在建構子中再次顯式賦值相同預設值,屬純粹浪費。
final 類別不可被繼承,所有方法隱含 final,編譯器可進行內聯優化,平均提升 50% 效能(視編譯器實作而定)。String 即為經典範例。
參數與區域變數存放於 Stack(棧),存取速度遠快於 Heap(堆)上的靜態/實例欄位。JIT 編譯器更易對區域變數進行暫存器分配等進階優化。
val * 8 → val << 3、val / 2 → val >> 1。位移指令單週期完成,乘除法需多週期。注意:需加註解,否則損害可讀性。
WebLogic、OpenSymphony 支援片段/頁面級快取。購物車、首頁等「讀多寫少」頁面效果顯著;邏輯複雜頁面獲益較大。
直接遠端呼叫 Entity Bean 的每個 getter 都是一次 RMI 呼叫。Session Bean 為本地介面,可將資料聚合後一次傳回,並改善事務管理(僅在事務邊界提交,避免頻繁「載入-讀取」)。若 Entity Bean 僅做 CRUD,改用 Session Bean 內部直連 JDBC 效能更佳。
<%@ include file="..." %>:編譯期靜態包含,效能最佳,適用靜態頁首/頁尾。<jsp:include page="..." />:執行期動態包含,靈活但有開銷,僅用於內容頻繁變動或請求前無法確定的資源。Entity Bean 的 getter 標記 read-only="true",容器可跳過 ejbStore(),減少資料庫寫入。
JNDI 查詢 EJBHome 開銷大,應放在 Servlet.init() 或實作 EJBHomeCache (Singleton) 複用。
避免 RMI 序列化/網路傳輸開銷。限制:Client 與 Bean 必須同一 JVM、參數傳遞改為 by-reference、不拋 RemoteException、Reference 不可序列化。
大量 Session 導致記憶體壓力、GC 停頓、甚至 Swap。HttpSession.invalidate() 應在登出頁主動呼叫;設定 setMaxInactiveInterval() 縮短逾時。
純靜態頁面加入 <%@ page session="false" %>,避免自動建立 Session。
HttpSessionBindingListener,在 valueUnbound() 釋放資源。靜態資源站點受益;高負載動態站點會佔用連線資源,導致執行緒耗盡。Web Server 與 App Server 同機時影響更大。
資料庫欄位用 Unicode (Code Page 13488) 儲存字元,JDBC 驅動免轉碼。代價:儲存空間翻倍;若其他非 Unicode 應用共用 DB,驅動仍需轉碼。
預設每次 32 列。大結果集設 setFetchSize(512) 可大幅減少網路往返。限制:可捲動游標或 FOR UPDATE 查詢無效。
購物車/目錄等 Session 級資料量大時,改用 In-Memory DB (如 TimesTen):操作全在記憶體、無複雜緩衝演算法、簡單鎖機制、速度極快。資料允許暫時性丟失(重啟後重建)。
<applet archive="app.jar" ...> 減少下載體積、加快啟動。
小型 PreLoader Applet 顯示「載入中...」,背景執行緒載入主 Applet,再 setStub()、add() 替換顯示。編譯後 < 2KB,秒開。
實作 ImageObserver.imageUpdate(),ALLBITS 就緒時呼叫 repaint(),避免畫面閃爍與不完整顯示。
// 基礎版:不清屏直接畫
public void update(Graphics g) { paint(g); }
// 進階版:只重繪變動區域
public void update(Graphics g) {
g.clipRect(x, y, w, h);
paint(g);
}
視窗調整/捲動產生大量重繪事件。引入「幾毫秒延遲」:收到新事件取消當前重繪、只處理最新事件。耗時操作啟動工作執行緒,避免凍結 EDT (Event Dispatch Thread)。
離屏緩衝繪圖完成後一次 drawImage 到螢幕,低優先級執行緒繪圖,主執行緒保持響應。
JDK 1.2+ 軟體繪圖管線核心,可訪問像素緩衝,支援 RGB/灰階,大幅提升 2D 繪圖效能。
透過 createVolatileImage() 建立顯存圖片,利用 GPU 矩形填充等加速。需定期呼叫 validate() 檢查內容是否遺失 (contentsLost()) 並重繪。
setScrollMode(int mode) 啟用作業系統級 Blitting(螢幕緩衝區直接位移),僅重繪新露出區域。前台捲動必定受益;後台捲動可能降級。