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

EJB 性能優化實戰:開啟 enable-call-by-reference 避免跨 EAR 遠程調用序列化開銷

     編輯:Java 相關知識

某項目採用 WebLogic 9.2 + EJB 2.0 三層架構,層間通過 Remote 接口調用,壓測發現單次 EJB 呼叫耗時 300-500ms。Thread dump 顯示大量線程阻塞於 Java 序列化鎖。根因:各層部署在不同 EAR,導致 enable-call-by-reference=true 不生效,強制走 RMI 序列化。

問題重現與驗證

  • 模擬環境:1 Servlet + 3 SLSB 串聯調用,參數攜帶 1000 個對象實例。
  • LoadRunner 100 線程、1 分鐘壓測:
配置吞吐量
enable-call-by-reference = false558
enable-call-by-reference = true (同一 EAR)21,163

近 40 倍差距,直觀證明序列化開銷佔比極高。

核心結論

  1. Java 原生序列化極慢(CPU 密集、同步鎖競爭)。
  2. enable-call-by-reference 僅在**同一 EAR 內**的 EJB 間生效,跨 EAR 無效。
  3. 架構調整:將強關聯 EJB 合併打包至單 EAR,或改用 Local 接口、傳值對象(DTO)減少對象圖大小。

最佳實踐清單

  • 預設開啟 enable-call-by-reference=true(weblogic-ejb-jar.xml)。
  • 嚴格控制 EAR 劃分:高頻調用組件同 EAR,跨域/跨系統才用 Remote。
  • 參數對象精簡:避免傳遞大集合、深層對象圖;必要時手工實現 Externalizable 或改用 Protobuf/Kryo。
  • 監控序列化熱點:定期抓 Thread dump 分析 ObjectOutputStream.writeObject 堆棧。
附件:完整 Eclipse 測試項目下載鏈接(含 LoadRunner 腳本、Thread dump 分析報告)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved