某項目採用 WebLogic 9.2 + EJB 2.0 三層架構,層間通過 Remote 接口調用,壓測發現單次 EJB 呼叫耗時 300-500ms。Thread dump 顯示大量線程阻塞於 Java 序列化鎖。根因:各層部署在不同 EAR,導致 enable-call-by-reference=true 不生效,強制走 RMI 序列化。
| 配置 | 吞吐量 |
|---|---|
| enable-call-by-reference = false | 558 |
| enable-call-by-reference = true (同一 EAR) | 21,163 |
近 40 倍差距,直觀證明序列化開銷佔比極高。
enable-call-by-reference 僅在**同一 EAR 內**的 EJB 間生效,跨 EAR 無效。enable-call-by-reference=true(weblogic-ejb-jar.xml)。Externalizable 或改用 Protobuf/Kryo。ObjectOutputStream.writeObject 堆棧。附件:完整 Eclipse 測試項目下載鏈接(含 LoadRunner 腳本、Thread dump 分析報告)。