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,并且使用之前对其带来的性能影响进行一个较为合理、全面的评估。