`

j2ee项目性能分析工具jwebap使用简介

阅读更多
今天突发奇想的对j2ee项目的性能监控来了兴趣,索性找找资料研究一下!

可能很多朋友在性能优化方面都有很多困扰:程序在哪方面存在缺陷?sql哪里有瓶颈?哪个请求最频繁?哪个请求耗时最长……从某种意义上说,解决问题并不是特别困难的事儿,但如何发现问题的问题会经常困扰着我。

今天给大家介绍一款j2ee项目性能监测工具:jwebap!通过简单的研究,发现这东西还是挺好用的,哈哈!

一、jwebap简介  参见 leadyu的博客
Jwebap是一个用于J2EE工程(EJB以及WebModule系统)进行性能监控的组件,它有几个特点:
  1)基于ASM实现类的静态增强,可以无缝的部署于J2EE系统,对系统的开销几乎可以忽略
  2) 部署和使用非常的简单,整个Jwebap的部署只需要部署jwebap_core_**.jar以及需要使用的各种plugin_**.jar,然后配置 jwebap.xml和web.xml就可以完成所有的部署,比起绝大多数的profiling容易的多。 同时Jwebap提供Web Console进行整个Jwebap的管理和数据展现。在API层提供一套默认的视图框架供plugin开发者使用,可以只用Jar包就开发出相当漂亮的 Web界面。
  3)Jwebap的开发分为两个部分Jwebap-core部分,Jwebap-plugin部分。core部分基于jdk14 提供了类静态增强,轨迹生命管理,Plugin管理,视图框架等等,在这个基础上开发plugin。我觉得,好的profiling应该能够根据不同的人 群按需使用,同时在功能不断复杂和强大的过程中仍然能够保证较轻的架子。
    理论部分原作者已经介绍的很详细了,这里就不再赘述。直接上干货!
二、jwebap的部署

1、将jwebap_0.6.1.jar、tracer_0.6.1.jar以及依赖包commons-beanutils.jar、commons-betwixt-0.8.jar、commons-digester-1.7.jar、commons-logging.jar、commontemplate-0.8.1.jar、jxl.jar导入到项目的classpath下。(一般webapp项目放在web-inf下的lib中即可)。
2、将jwebap.xml导入到classpath下。
jwebap.xml
<?xml version="1.0" encoding="UTF-8"?>
<jwebap>
	<!--plugins-->
	<plugin name="Tracer" ref="${ABSOLUTE_PATH}/tracer_0.6.1.jar"/>
	 
	<!--dispatcher-->
	<dispatcher name="RedirectDispatcher" mapping="" type="org.jwebap.ui.controler.DefaultRedirectDispatcher"  />
	<dispatcher name="ActionDispatcher" mapping="/console/*" type="org.jwebap.ui.controler.ActionDispatcher"  />
	<dispatcher name="ResourceDispatcher" mapping="/resources/*" type="org.jwebap.ui.controler.ResourceDispatcher"  />
	
	<!--action-mapping-->
	<action-mapping>
		<action path="/" type="org.jwebap.ui.action.EmptyAction" template="resources/view/index.ctl" />
		<action path="/deploy/plugins" type="org.jwebap.ui.action.EmptyAction" template="resources/view/plugin_deploy.ctl" />
		<action path="/deploy/plugins/list" type="org.jwebap.ui.action.PluginListAction" />
		<action path="/deploy/plugins/remove" type="org.jwebap.ui.action.PluginRemoveAction" />
		<action path="/deploy/plugins/new" type="org.jwebap.ui.action.PluginFormAction"  template="resources/view/plugin_deploy_new.ctl" />
		<action path="/deploy/plugins/add" type="org.jwebap.ui.action.PluginAddAction"  />
		
		<action path="/deploy/plugins/detail" type="org.jwebap.ui.action.EmptyAction"  template="resources/view/plugin_detail.ctl" />
		<action path="/deploy/plugins/components/list" type="org.jwebap.ui.action.ComponentListAction" />
		<action path="/deploy/plugins/components/detail" type="org.jwebap.ui.action.ComponentFormAction"  template="resources/view/component_detail.ctl" />
		<action path="/deploy/plugins/components/save" type="org.jwebap.ui.action.ComponentSaveAction"  />
	</action-mapping>
</jwebap>

	

3、修改项目下的web.xml,添加jwebap相关的配置
	<context-param>
		<param-name>jwebap-config</param-name>
		<param-value>/WEB-INF/jwebap.xml</param-value>
	</context-param>
	<listener>	
		<listener-class>org.jwebap.startup.JwebapListener</listener-class>	
	</listener>
	<filter>
		<filter-name>PageDetectFilter</filter-name>
		<filter-class>org.jwebap.plugin.tracer.http.DetectFilter</filter-class>
		<init-param>
			<param-name>excludeUrls</param-name>
			<param-value>/detect;/detect/*;*.js;*.jpg;*.htm;*.html;*.gif;*.png;*.css;*.swf</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>PageDetectFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>detect</servlet-name>
		<servlet-class>org.jwebap.ui.controler.JwebapServlet</servlet-class>	
	</servlet>

	<servlet-mapping>
		<servlet-name>detect</servlet-name>
		<url-pattern>/detect/*</url-pattern>
	</servlet-mapping>
	


4、修改tracer_0.6.1.jar中的plugin.xml文件(在jar包的META-INF文件夹下)
	……
	<component name="MethodComponent" type="org.jwebap.plugin.tracer.method.MethodComponent">
		<component-param>
			<name>trace-filter-active-time</name>
			<value>-1</value>
			<description>(ms) timings filter's over time</description>
		</component-param>
		<component-param>
			<name>trace-max-size</name>
			<value>1000</value>
			<description>max over-time trace size</description>
		</component-param>
		<component-param  style="longtext">
			<name>detect-clazzs</name>
			<value>
			com.gamecenter.controller.report.*;<!-- 改为需要监控的包或者类 -->
			</value>
			<description>
			package name and class name that monitored by MethodComponent,
			e.g.: 'test.*;test.Test' , divided by ';'
			</description>
		</component-param>
	</component>
	<component name="JdbcComponent" type="org.jwebap.plugin.tracer.jdbc.JdbcComponent">
		<component-param>
			<name>trace-filter-active-time</name>
			<value>-1</value>
			<description>(ms) timings filter's over time</description>
		</component-param>
		<component-param>
			<name>trace-max-size</name>
			<value>1000</value>
			<description>max over-time trace size</description>
		</component-param>
		<component-param  style="longtext">
			<name>connection-listener</name>
			<value>
			org.jwebap.plugin.tracer.http.ServletOpenedConnectionListener;org.jwebap.plugin.tracer.method.MethodOpenedConnectionListener
			</value>
			<description>Connection Listener</description>
		</component-param>
		<component-param  style="longtext">
			<name>driver-clazzs</name>
			<value>com.jolbox.bonecp.BoneCPDataSource</value><!-- 配置数据库连接池驱动,我这里用的是bonecp连接池 -->
			<description>
			1)Local datasource: set your ConnectionManagerClass,or the connection pool 's datasource. If you have more than one class ,divided by ';'.
												c3p0:com.mchange.v2.c3p0.ComboPooledDataSource; 
												dbcp: org.apache.commons.dbcp.BasicDataSource
												Also,other class. Jwebap will inject driver-clazzs,and detect any connection and datasource object it's method renturn.
												Note:  'driver-clazzs =jdbc driver' is deprecated. Beacause of connection pool, set 'driver-clazzs =jdbc driver', jwebap will find out all connection is leaked.
			2)JNDI datasource: If your application uses jndi datasource, you can set the class which manages connections in your application as driver, e.g.: 'com.china.telecom.ConnectionManager'. 
			Else if you use spring to get jndi datasource ,
			you also can set driver-clazzs=org.springframework.jndi.JndiObjectFactoryBean.JdbcComponent 
			will inject this class to proxy all connection the class's method return.
            org.springframework.orm.ibatis.SqlMapClientFactoryBean
			</description>
		</component-param>
	</component>
	
	


至此,jwebap的配置就完成了!让我们赶快启动应用来测试一下吧!

应用正常启动后,在浏览器中输入 http://ip:port/servername/detect/console/ 你会看到jwebap的性能检测界面,大功告成!




三、遇到的问题:
1、JdbcComponent 中driver-clazzs的设置。这里直接设置成数据库连接池就好了。但是设置完成以后可能会出现以下错误:
org.jwebap.toolkit.bytecode.InjectException: com.jolbox.bonecp.BoneCPConfig注入失败.
……………………
Caused by: org.jwebap.toolkit.bytecode.asm.DefineBytecodeException: com/jolbox/bonecp/BoneCPConfig注入错误:loader (instance of  org/apache/catalina/loader/WebappClassLoader): attempted  duplicate class definition for name: "com/jolbox/bonecp/BoneCPConfig"

这个问题之前我也尝试了很多方法,最后才发现这个重复加载是由于spring和jwebap都加载了boncp类造成的,而我这里采取的解决办法就是将
	    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
	


放在

	   <listener>
        <listener-class>
            org.jwebap.startup.JwebapListener
        </listener-class>
    </listener>
	

的后面即可。至于为什么,我现在还不是很清楚,欢迎哪位大师指点一二!
2、如果JdbcComponent 中driver-clazzs的设置没有报错,但是控制台下的jdbc Trances就是没有监测到数据,那么你的driver-clazzs可能没有和你项目中所使用的数据库连接池(或驱动)匹配上,再换个数据源试试吧!
  • 大小: 57.4 KB
分享到:
评论
3 楼 huzihack 2014-06-23  
楼主好,谁什么通过此种方法配置,无法监控到调用了哪些方法呢?而且后台报注入失败的错误?
2 楼 mazzystar 2013-10-10  
第一个问题是这样的:jwebap的原理是使用ASM修改类的字节码(后面说的增强就是指这个),已达到监控每个方法的目的;也就是说需要由jwebap来加载其增强过的class。

你配置的JdbcComponent的driverClass为com.jolbox.bonecp.BoneCPDataSource,其父类为com.jolbox.bonecp.BoneCPConfig,jwebap默认是增强父类的,所以会修改com.jolbox.bonecp.BoneCPConfig的字节码。

如果把Spring的listener放前面,会间接导致加载以上两个class(由当前的classloader加载),所以后续jwebap尝试加载增强过的class时,就会报重复加载的异常了。
1 楼 angel_kaikai 2012-12-24  
你好:
刚看了你的blog,介绍的jwebap非常适合我现在的项目性能优化
但由于本人java基础为0,对配置这样的环境出现的问题无法解决
楼主如果方便,是否可以帮忙看看问题?
非常感谢~!
我的QQ:1012640851,谢谢啦

相关推荐

    经典J2EE项目案例

    经典J2EE项目案例 从给定的文件信息中,我们可以提取出以下知识点: 1. 项目开发环境和工具 * 项目开发环境:Tomcat6.0、IE10、Firefox8.0、JDK1.7、Windows 7 * 项目开发工具:MyEclipse9.0、Mysql、JUnit 2. ...

    J2EE项目开发与设计随书源码

    通过对这些源码的分析和学习,开发者可以加深对J2EE设计模式的理解,掌握实际项目开发中的最佳实践,从而提升自己的技能水平。无论是初学者还是有经验的开发者,这份资源都能提供宝贵的参考和学习材料。

    简单的j2ee项目

    6. **Maven或Gradle**:现代J2EE项目可能使用构建工具,如Maven或Gradle,来管理依赖和构建流程。 7. **JNDI(Java Naming and Directory Interface)**:在J2EE中,JNDI用于查找和绑定资源,如数据源、邮件会话等...

    简单的J2EE项目

    10. **IDE支持**:开发者可能使用IntelliJ IDEA、Eclipse等集成开发环境来编写、构建和调试J2EE项目。了解如何利用这些工具提高开发效率是必要的。 通过这个简单的J2EE项目,你可以学习到基本的J2EE概念和实践,为...

    J2EE项目实例源码

    《J2EE项目实例源码:构建DVD图书馆管理系统》 在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是一种广泛应用于企业级应用开发的平台,它提供了丰富的服务和组件模型,使得开发者能够构建分布式、多层的...

    J2EE项目更新补丁包打包工具

    在实际使用这个工具时,开发者或运维人员首先需要准备J2EE项目的旧版本和新版本,然后通过该工具分析差异并生成补丁。生成的补丁文件可以分发给用户,他们只需按照README中的指示应用补丁,即可实现J2EE项目的无痛...

    j2ee项目开发案例

    在《J2EE案例开发》这个压缩包中,你可能会找到一个完整的J2EE项目实例,包括源代码、配置文件、数据库脚本等,通过学习和分析这个案例,你可以更好地理解上述知识点如何在实际项目中应用。记得动手实践,理论结合...

    J2EE项目开发实用案例

    本书汇集了大量企业级应用项目开发的经验,归纳了不同项目中使用的框架、模式、设计方法、开发方法,形成一个完整的技术体系和指导方法,以供用J2EE进行项目开发的初级人员和有一定经验的高级开发人员阅读。...

    集成jetty的j2ee项目demo

    - 在J2EE项目中集成Jetty,通常需要添加Jetty的依赖库到项目的类路径中,这可以通过Maven或Gradle等构建工具完成。 - 配置服务器启动脚本或初始化代码,以便在运行时加载并启动Jetty,处理Servlet和过滤器。 3. *...

    一个J2EE项目的最小工具集

    ### J2EE项目最小工具集解析 在深入探讨J2EE项目所需的关键工具之前,我们首先需要理解何为J2EE。J2EE(Java 2 Platform, Enterprise Edition)是Sun Microsystems公司推出的一个用于开发、部署多层分布式网络应用...

    J2EE项目案例源代码

    **J2EE项目案例源代码详解** J2EE(Java 2 Platform, Enterprise Edition)是Java平台上用于构建企业级分布式应用程序的框架。它提供了一系列的服务和API,支持多层架构,包括Web层、业务逻辑层和数据访问层,旨在...

    j2ee项目开发经验分享

    j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发...

    J2EE项目开发模板

    在提供的压缩包中,"JAVA EE 论文模板.doc"可能是对J2EE项目开发模板的详细讨论或案例分析。这份文档可能包含了模板的具体结构、使用方法、优势以及实际项目中的应用示例,对于深入理解和应用J2EE项目开发模板非常有...

    J2EE常见应用性能问题

    ### J2EE常见应用性能问题解析 在Java2平台企业版(J2EE)的...总之,面对J2EE应用中的性能挑战,开发者应积极采用现代化的监控工具,结合多层面分析方法,精准定位并解决性能问题,从而提升应用的稳定性和用户体验。

    J2EE项目管理

    本项目以"J2EE项目管理"为主题,旨在通过使用jsp、servlet和mysql,提供一个实践学习J2EE技术基础的机会。 首先,我们要理解JSP(JavaServer Pages)是Java的一种动态网页技术,它允许开发者在HTML代码中嵌入Java...

    J2EE项目实战案例研究

    本案例中使用的MyEclipse平台,是一款集成了Eclipse的高级开发工具,特别适合J2EE项目的开发。MyEclipse提供了强大的编码、调试、部署等功能,能够简化开发过程,提高效率。 #### 三、开发流程详解 1. **安装配置...

    J2EE项目源码测试用例

    通过分析这些测试用例,开发者可以学习如何有效地测试自己的J2EE项目,提高代码质量,减少缺陷,并且为后期维护提供便利。 总之,J2EE项目的测试用例是保证项目质量和可靠性的重要手段。深入理解和实践测试用例的...

    j2ee项目需求文档,实验题目

    本项目需求文档涉及的是一个J2EE项目的具体实施,涵盖了不同平台的需求分析和详细设计,这对于开发者来说是至关重要的参考材料。 首先,我们需要理解J2EE的核心特性。J2EE包括一组服务、API和协议,用于简化企业级...

    软件测试技术在J2EE项目中的应用

    除了这些工具,还有一些通用的测试工具在J2EE项目中也很常见,例如SonarQube用于静态代码分析和质量控制,Jenkins用于持续集成和持续部署,确保每次代码更改后都能快速发现问题。 在实际测试过程中,还需要遵循敏捷...

Global site tag (gtag.js) - Google Analytics