Sitemesh 是一個很好的頁面渲染框架,基本上我如今所在項目都是適用sitemesh作頁面框架和整合渲染的,給頁面部分的工做帶來了很大的便利性。java
在sitemesh的文檔中,對於sitemesh的工做原理給出了一個圖示,根據這個圖能夠看出,sitemesh是經過組合適用filter和 標籤將被渲染頁面的內容抽取出來,再整合到一個統一的框架頁面中去。曾經有一段時間測試環境的Websphere服務器頻繁出現內存溢出的問題,在跟蹤內 存溢出問題時,發現sitemesh組件使用StringBuffer對象進行大量內存申請的動做。這就須要檢測sitemesh具體是如何來分析頁面 的,個人猜想就是將被渲染的頁面中的最終HTML代碼展出到一個大的字符串,而後根據關鍵標籤來進行分析和內容抽取,而後再整合到框架頁面中。先無論 sitemesh是用什麼方式來分析、抽取和整合的,他對於內存的影響是比較明顯的,因此,本實驗的目的就是比較使用sitemesh和不使用 sitemesh時,運行期性能是否存在差別。web
本實驗使用到的環境以下:服務器
· OS: Windows XP Professional SP2app
· HW: Intel Core 2 Duo T7300 2.0GHz, 2GB RAM框架
· Web Server: Resin 3.2.1jsp
· Sitemesh: 2.3ide
· 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測試
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. 數據彙總及處理
根據測試的結果,整理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%。
從上述測試數據來分析,使用sitemesh對於系統性能是有較大的影響的,主要表如今GC的次數會顯著增多。建議在大壓力、頁面內容大的系統中,慎重選擇sitemesh,而且使用以前對其帶來的性能影響進行一個較爲合理、全面的評估。