本文大纲
《JVM剖析及性能跟踪》
案例4--JProfile使用注意
事件
我再对项目做压力测试时,发现CPU占用高,GC的更加频繁。这对于经验丰富的我来说,排查这种问题小菜一碟。
但这次使用JProfile分析,我未能快速的发现原因。是因为我习惯在用JProfile分析cpu占用时,只过滤出我自己项目的包名,只分析我自己写的代码,这是一般情况是正确的。
但这次显然发生性能问题的代码不是我自己写的,很可能就是某框架的代码。
继续分析
我的这个项目中使用了SiteMesh做为模板装饰引擎。
原因是JProfile在分析时默认忽略了一批包名,其中就有SiteMesh的包,请看下图,这些包都被忽略不被jprofile分析。导致我一直未能发现是SiteMesh架构的性能问题。

解决方法
把SiteMesh的包名加入到分析中。
注意:清理以下列表,本列表中的方法会被忽略。

到这里由于发现是sitemesh框架性能差,代码不是我自己写的,无法优化。 分析停止。
SiteMesh性能较差
使用sitemesh对于系统性能是有较大的影响的,主要表现在:
- 1、导致消耗更多的内存,GC的次数会显著增多。
- 2、CPU使用率显著增高。
- 3、由其是页面内容(体积)越大越明显。
sitemesh性能很差,由于使用了装饰器模式,要去解析html代码,会产生很多垃圾对象,所以会频繁的引起GC,CPU的负担会加大。
使用sitemesh后,QPS从450降到了150,慢了3倍。平均响应时间也从100ms涨到300ms,慢了3倍。多使用了一倍的内存,多使用一倍的CPU。
目前使用了SiteMesh框架的系统仅有Admin管理后台,由于使用人员少、由于页面内容不太大,性能尚可能用。后续考虑逐步替换掉SiteMesh。
有间接的解决办法:
- 1、提高cpu的性能(SiteMesh较费cpu,计算密集型)
- 2、使用tomcat集群部署(提高并发度)