1. 目的
Sitemesh 是一個很好的頁面渲染框架,基本上我現在所在項目都是適用sitemesh做頁面框架和整合渲染的,給頁面部分的工作帶來了很大的便利性。
在sitemesh的文檔中,對于sitemesh的工作原理給出了一個圖示,根據這個圖可以看出,sitemesh是通過組合適用filter和標簽將被渲染頁面的內容抽取出來,再整合到一個統一的框架頁面中去。曾經有一段時間測試環境的Websphere服務器頻繁出現內存溢出的問題,在跟蹤內存溢出問題時,發現sitemesh組件使用StringBuffer對象進行大量內存申請的動作。這就需要檢測sitemesh具體是如何來分析頁面的,我的猜測就是將被渲染的頁面中的最終HTML代碼展出到一個大的字符串,然后根據關鍵標簽來進行分析和內容抽取,然后再整合到框架頁面中。先不管sitemesh是用什么方式來分析、抽取和整合的,他對于內存的影響是比較明顯的,所以,本實驗的目的就是比較使用sitemesh和不使用sitemesh時,運行期性能是否存在差異。
2. 環境
本實驗使用到的環境如下:
· OS: Windows XP Professional SP2
· HW: Intel Core 2 Duo T7300 2.0GHz, 2GB RAM
· Web Server: Resin 3.2.1
· Sitemesh: 2.3
· Test Tool: Load Runner 8.0
· JDK: Java HotSpot(TM) Client VM 1.5.0_09-b03
· Analysis Tool: IBM Pattern Modeling and Analysis Tool for Java Garbage Collector 2.5
3. 過程
1. 使用ant example創建sitemesh自帶的example web應用
2. 在sitemesh example應用中加入一個JSP頁面data.jsp,該頁面中包含一個43行7列的靜態表格,表格部分的HTML源碼約17KB
3. 同樣制作上述數據的非sitemesh處理頁面data_nosm.jsp,在sitemesh的配置文件decorators.xml中將data_nosm.jsp添加到排除列表
4. 以展開包的方式部署sitemesh example應用到resin服務器
5. 設置resin的JVM參數為:-Xms64m -Xmx256m -XX:MaxPermSize=256m -Xss1m -verbose:gc -Xloggc:C:/apps/resin-3.2.1/gc.log -XX:+PrintGCDetails
6. 在Load Runner中制作2個壓力測試腳本,一個用來請求data.jsp,一個用來請求data_nosm.jsp
7. 在Load Runner中設計壓力測試場景:10個用戶,持續請求5分鐘,每個用戶的每輪請求中包含10次對于頁面的請求
8. 重新啟動resin服務器,進行data.jsp的壓力測試。測試完成之后,收集Load Runner的數據以及GC的數據
9. 重新啟動resin服務器,進行data_nosm.jsp的壓力測試。測試完成之后,收集Load Runner的數據以及GC的數據
10. 數據匯總及處理
4. 結果
根據測試的結果,整理GC部分和壓力測試部分的數據如下:
| 使用sitemesh | 未使用sitemesh |
GC次數 | 6,746 | 74 |
Full GC次數 | 1 | 1 |
GC消耗 | 0.02 | 0.00 |
GC暫停(秒) | 7.00 | 0.00 |
最大持久代(字節) | 8,388,608.00 | 8,388,608.00 |
平均持久代(字節) | 6,036,328.00 | 6,205,085.00 |
最大舊生代(字節) | 61,983,744.00 | 59,024,384.00 |
平均舊生代(字節) | 42,583,685.00 | 31,929,903.00 |
最大新生代(字節) | 61,983,744.00 | 59,024,384.00 |
平均新生代(字節) | 4,426,710.00 | 4,610,566.00 |
請求次數 | 137,344.00 | 198,188.00 |
平均每秒請求 | 454.78 | 658.43 |
頁面平均響應時間(秒) | 0.042 | 0.029 |
上表的數據制作成圖表如下(為了便于圖表顯示,部分數據進行了放大):
在上表中,GC消耗和GC暫停考量指標中,未使用sitemesh的情況下顯示為0,是因為所用的分析工具IBM Pattern Modeling and Analysis Tool for Java Garbage Collector 2.5的顯示精度不足導致,實際的并非是真正的0,而應該是一個很小的數值。
從數據上看,使用sitemesh和不使用sitemesh對于虛擬機堆內存的使用差異不太大,但是在GC次數上的差異很大。從GC日志的詳細信息可以看出,在使用sitemesh時,發生次要GC(Minor GC)的頻率非常的高,可以推斷在運行時期產生了大量的短生命周期的對象,然后又迅速的被釋放,GC在新生代就已經完成了。主要GC(Major GC, Full GC)在使用sitemesh和不使用的情況下,均發生了1次,而且這1次主要GC也是在resin啟動中發生的,不是應用在進行壓力測試時發生的。由于使用sitemesh時的GC次數遠遠大于不使用sitemesh,所以在整個測試過程中,GC上消耗的時間也是差異非常大的。
從壓力測試的探測可以看出,不使用sitemesh時完成的請求數是使用sitemesh時的144.3%。同時頁面響應時間也僅為使用sitemesh時的69.0%。
5. 結論
從上述測試數據來分析,使用sitemesh對于系統性能是有較大的影響的,主要表現在GC的次數會顯著增多。建議在大壓力、頁面內容大的系統中,慎重選擇sitemesh,并且使用之前對其帶來的性能影響進行一個較為合理、全面的評估。
posted on 2009-07-14 22:17
YODA 閱讀(3356)
評論(8) 編輯 收藏