本文大纲

《JVM剖析及性能跟踪》

案例4--JProfile使用注意

正文

事件

我再对项目做压力测试时,发现CPU占用高,GC的更加频繁。这对于经验丰富的我来说,排查这种问题小菜一碟。

但这次使用JProfile分析,我未能快速的发现原因。是因为我习惯在用JProfile分析cpu占用时,只过滤出我自己项目的包名,只分析我自己写的代码,这是一般情况是正确的。

但这次显然发生性能问题的代码不是我自己写的,很可能就是某框架的代码。 

继续分析

我的这个项目中使用了SiteMesh做为模板装饰引擎。

原因是JProfile在分析时默认忽略了一批包名,其中就有SiteMesh的包,请看下图,这些包都被忽略不被jprofile分析。导致我一直未能发现是SiteMesh架构的性能问题。 

image2017-10-5 7:22:46.png

解决方法

把SiteMesh的包名加入到分析中。

注意:清理以下列表,本列表中的方法会被忽略。

image2017-10-5 7:23:39.png

到这里由于发现是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集群部署(提高并发度)