J2EE 系統在高併發下,資源爭用與有限伺服器資源(記憶體、CPU、頻寬)的矛盾最為凸顯。正確的程式碼不等於高效能,效能往往決定專案成敗。本文從 Java 基礎、I/O、Servlet、EJB、資料庫存取五大面向,總結實戰優化技巧。
String 不可變,+ 操作產生大量暫存物件。建議預估長度初始化 StringBuffer:
StringBuffer buffer = new StringBuffer(30); // 預分配容量
buffer.append("hello").append(",").append("welcome to world!");
String result = buffer.toString();
Vector、ArrayList 等集合預設容量較小(如 Vector 為 10),擴容涉及陣列複製。已知資料量時指定初始容量:
Vector vect = new Vector(100); // 避免多次擴容
// 差:每次迴圈呼叫 size()
for (int i = 0; i < vect.size(); i++) { ... }
// 優:提取至區域變數
int size = vect.size();
for (int i = 0; i < size; i++) { ... }
模運算優化:使用遞減計數器取代 i % 10 == 9。
new 操作成本極高(構造函數鏈 + GC 壓力),延遲建立、盡量重用物件(透過 setValue 等方法重置狀態)。static 共享記憶體。final/private 方法利於編譯器內聯優化。try/catch 區塊。陣列複製使用 System.arraycopy() 替代手動迴圈,效能提升顯著。
System.out.println() 輸出量,生產環境建立 Debug 工具類管理輸出等級與開關。BufferedReader/Writer、BufferedInput/OutputStream 替代非緩衝對應類。synchronized),保持多執行緒優勢。HttpSession 僅存必要資料;大量/大物件導致記憶體壓力,需權衡。session.invalidate() 釋放資源,減少無效 Session 佔用記憶體。get 觸發交易與 Load/Store;Session Bean 封裝可減少容器交易處理,集中業務邏輯。remove(),避免鈍化/活化序列化開銷與超時前的記憶體佔用。DataSource + JNDI 獲取連線,避免頻繁建立/關閉連線開銷。Connection/Statement/ResultSet 關閉邏輯置於 finally 區塊,逐一 try-catch 確保釋放。效能優化需聚焦瓶頸程式碼,並結合伺服器軟硬體、叢集、架構設計、資料結構與演算法綜合考量。良好編碼規範是基礎,針對性調優才能事半功倍。