2014-02-13 79 views
19

我有一個運行在Coldfusion 10 64bit上的web服務。在調查內存泄漏時,我將JRE從1.6升級到1.7,但注意到性能明顯下降。我創建了一個簡單的測試webservice,在JRE 1.6上,只要將JRE更改爲1.7,我就可以以每分鐘5000個請求的速度輕鬆運行,儘管此速率每分鐘降低到2000或更低。有誰知道調整設置或我缺少的東西。Coldfusion 10在使用Java 1.7時比使用1.6時慢很多

首選是使用JRE 1.7,因爲它似乎已修復了我遇到的內存泄漏問題。

  • 運行服務器JRE:Java版本 「1.7.0_51」 的Java(TM)SE運行時環境(建立1.7.0_51-B13)的HotSpot的Java(TM)64位服務器VM(24.51建設-B03,混合模式)

  • 垃圾收集JVM設置:-XX:+UseParallelGC

  • 更改垃圾收集:-XX:+UseG1GC這沒有什麼區別。

跟隨the recommendations from here沒有增加表現。將與jvisualvm審查和張貼我的發現。

更新: Java 7有changed the way it deals with synchronizing class loaders,它看起來像這可能是放緩的原因。

更新 Adob​​e已經確認了該錯誤並正在修復它。 Adobe bug base record.

+0

您正在運行服務器JRE還是客戶端JRE? –

+0

好問題彼得。我怎麼知道我正在運行哪一個? –

+1

應該說,如果你從命令行執行'java -version' - 如果CF沒有使用系統默認值,你需要'/ path/to/cf/jre/bin/java -version'或類似的。或者查看CF管理員的「系統信息」頁面 - 看起來你會想要Java VM Name中的「64位服務器虛擬機」。 –

回答

5

對此的回答是,Adobe已經確認該錯誤並正在修復它。 Adobe bug base record

+0

這是否得到修復?錯誤記錄將其列爲另一個錯誤的副本,但沒有提及重複或其狀態。 – user3071284

+1

是的,這在ColdFusion 11 Update 5和ColdFusion 10 Update 16中得到了修復。 –

1

我建議您在2次負載測試運行(JRE 1.6 vs. JRE 1.7)之間檢查JVM線程轉儲數據。過去,CF10類加載器問題與使用cfdump和cfquery內存(查詢查詢)有關。

將您的分析重點放在您使用JRE 1.7時可能遇到的任何線程鎖爭用問題上。

您所指的類加載器更改應該會實際上提高類加載操作的併發性,但仍然不是不可能的,因爲它可能會在您的環境中引起一些緩慢。

另一個建議是看你的GC內存分配率。爲此,請打開verbose:gc並比較兩次運行之間的輸出數據。確定GC內存分配速率和/或GC頻率的增加是否會成爲吞吐量下降的根本原因。

最後,對JVM參數進行非常仔細的回顧。確保您的Java堆調整參數(包括堆大小)與每個JRE 1.6完全相同,以便我們可以比較蘋果與蘋果。

+0

我用來進行負載測試的例子是一個簡化的web服務,它沒有查詢或轉儲。它創建了一個有2個合適的對象。 1是一個簡單的文本字符串,第二個屬性是一個對象數組。這第二個對象有一個屬性是一個字符串字段。這就是爲什麼我認爲這是由於類加載操作的併發性。 JVM參數與Identical相同,因爲它只是更改服務器正在使用的JRE。 稍後我會看看詳細的:gc輸出。 –

相關問題