论坛首页 Java企业应用论坛

Jwebap项目(四)——性能监控工具Jwebap: 0.5.8版本发布

浏览 49216 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-03-24  
用asm怎样实现 Integer i = new Integer(2)这样类似的指令?
0 请登录后投票
   发表时间:2008-03-25  


Method m = Method.getMethod("void test()");
ClassWriter cw = new ClassWriter(true);
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "test.AA", null, "java/lang/Object", null);
			
// 方法字节码访问者代理,在ASM中可以方便的使用它来完成指令的生成
GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, m,null, null, cw);

// 定义i变量
int result = mg.newLocal(Type.getType(Integer.class));

//调用new指令分配内存
mg.newInstance(Type.getType(Integer.class));
mg.dup();
// 压栈2
mg.push(2);
// 调用构造函数
mg.invokeConstructor(Type.getType(Integer.class), Method.getMethod("void <init>(int)"));
// 付值
mg.storeLocal(result);
mg.returnValue();
mg.endMethod();
			
cw.visitEnd();


关于VM指令的使用,对象的创建,VM Spec上有比较详细的说明,可以参考。

另外,jwebap发布0.5.9版本,后面我会写一篇文章介绍0.5.9版本,欢迎大家关注。
0 请登录后投票
   发表时间:2008-03-25  
jwebapp注入的方法都使用反射Method.invoke来调用源方法,开销比较大,如果换成直接调用是否能降低开销
0 请登录后投票
   发表时间:2008-03-25  
meikefu 写道
jwebapp注入的方法都使用反射Method.invoke来调用源方法,开销比较大,如果换成直接调用是否能降低开销


没有那么简单,对于原方法的调用是可以直接调用而且实现起来简单的多,但是这样只能实现,before和after的注入,注入的功能大大减弱。

所以,出于这点的考虑,jwebap简单的实现了invokeHandle的注入方式(还有需要改进的地方,比如多handle注入),可以用的很灵活,有兴趣的话可以参考JdbcComponent插件里面的JdbcInvokeHandle的运用方法。
0 请登录后投票
   发表时间:2008-03-25  
看到这个接口MethodInjectHandler.invoke传入的是java.lang.reflect.Method,源码中的2个实现类JdbcDriverInjectHandle,TraceMethodHandle,前者是after,后者是before.
看了看源码jwebapp,没有注入原方法,而是proxy原方法,如果以一个方法为元单位,除了before和after还有什么形式的注入?
数据库连接应该是一个系统的核心,如果在关键模块大量运用反射会导致性能下降
0 请登录后投票
   发表时间:2008-03-25  
生产环境应当没谁会去挂一个性能监视平台吧。
我觉得性能监视平台的效率只要不低到影响测试结果就不用做这么多考虑。
0 请登录后投票
   发表时间:2008-03-25  

我倒是希望能找到一个可以对执行的sql语句进行分类汇总的软件,可以统计好比有多少sql执行了多少次,每个sql语句的平均时间是多少。类似于oracle的查询分析工具。一直在用mysql,缺少这类东西,不知道Jwebap可否满足?
0 请登录后投票
   发表时间:2008-03-25  
引用
生产环境应当没谁会去挂一个性能监视平台吧。
我觉得性能监视平台的效率只要不低到影响测试结果就不用做这么多考虑。

不在生产环境上面监控在那里监控?刚才测试一下
public Integer step(Integer value)
	{
		return new Integer(value.intValue()*value.intValue());
	}
	
	public int callReferenceArgs(int loops) {
	    TimingClass timing = new TimingClass();
	    Integer value = new Integer(1234);
	    for (int index = 0; index < loops; index++) {
	        value = timing.step(value);
	    }
	    return value.intValue();
	}
	public int callReflectArgs(int loops) {
	    TimingClass timing = new TimingClass();
	    try {
	        Method method = TimingClass.class.getMethod
	            ("step", new Class [] { Integer.class });
	        Object[] args = new Object[1];
	        Object value = new Integer(1234);
	        for (int index = 0; index < loops; index++) {
	            args[0] = value;
	            value = method.invoke(timing, args);
	        }
	        return ((Integer)value).intValue();
	    } catch (Exception e) {
	        e.printStackTrace();
	    	return 0;
	    }
	}
	
	public static void main(String[] args) throws Exception
	{
		TimingClass tc = new TimingClass();
		int loop = 1000000;
		
		long a = System.currentTimeMillis();
		tc.callReferenceArgs(loop);
		System.out.println("引用调用:"+(System.currentTimeMillis() -a));
		
		long b = System.currentTimeMillis();
		tc.callReflectArgs(loop);
		System.out.println("反射调用:"+(System.currentTimeMillis() -b));
	}

在jre1.4下引用调用:31反射调用:219,差距有7倍左右.但是单位是毫秒,如果并发量不大应该整个系统的瓶颈应该不会在这里,只是为了探讨一下性能问题.


能否考虑接入jmx的mbean监控webserver的连接池,线程池,jms,jta,etc期待MemoryComponent,希望jwebapp更好更强
0 请登录后投票
   发表时间:2008-03-25  
meikefu 写道
看到这个接口MethodInjectHandler.invoke传入的是java.lang.reflect.Method,源码中的2个实现类JdbcDriverInjectHandle,TraceMethodHandle,前者是after,后者是before.
看了看源码jwebapp,没有注入原方法,而是proxy原方法,如果以一个方法为元单位,除了before和after还有什么形式的注入?
数据库连接应该是一个系统的核心,如果在关键模块大量运用反射会导致性能下降


会有更复杂的需求的,比如JdbcDriverInjectHandle,包装返回对象:

Object o;
		try {
			o = methodProxy.invoke(target, args);
		} catch (InvocationTargetException e) {
			// 抛出原有异常
			throw e.getCause();
		} finally {

		}
		if (!Modifier.isPrivate(method.getModifiers())
				&& Connection.class.equals(method.getReturnType())
				&& o instanceof Connection
				&& !(o instanceof TraceDetectConnection)) {
			return new TraceDetectConnection(_container, (Connection) o,
					_listeners);
		} else if (!Modifier.isPrivate(method.getModifiers())
				&& DataSource.class.equals(method.getReturnType())
				&& o instanceof DataSource
				&& !(o instanceof TraceDetectDataSource)) {
			return new TraceDetectDataSource(_container, (DataSource) o,
					_listeners);
		} else {
			return o;
		}


以后,会有更复杂的场景,至于反射带来了多大开销,起码从目前,我在几个电信省级生产系统的应用来看,没有感觉,当然以后,我觉得还需要细致的性能测试,我希望jwebap能够更多的应用于生产系统,这样才能真正解决问题(在几个存在性能问题的电信省级生产系统的应用中已经起到了很大的作用)

0 请登录后投票
   发表时间:2008-03-25  
myreligion 写道

我倒是希望能找到一个可以对执行的sql语句进行分类汇总的软件,可以统计好比有多少sql执行了多少次,每个sql语句的平均时间是多少。类似于oracle的查询分析工具。一直在用mysql,缺少这类东西,不知道Jwebap可否满足?


jwebap以后所有的监控功能都是plugin,现在的三个plugin还很基础,如果你有plugin的想法,欢迎交流^_^
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics