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