使用Spring AOP进行方法分析(基本执行时间)

时间:2009-09-02 07:56:38

标签: java profiling spring-aop

我正在寻找一个功能或软件,允许我轻松地分析我的方法执行时间,并选择通过包过滤器分析的内容。

我知道,这是剖析器101。 我使用TPTP分析器。但我对它并不满意。坦率地说,我只是不明白它是如何工作的,当我描述我的应用程序(以分析模式启动服务器)时,它将永远不做任何事情。 (好吧,不是我的期望:执行时间的简单输出)

所以我自己用系统时间进行分析(在方法的开头和结尾添加一行)。也不是那么坏。

我的问题是:我想测量使用Spring AOP进行方法调用之前和之后的系统时间,你能给我指点吗?这是一个好/坏的主意?代码库非常大,我们没有很多单元测试,难道不是“危险”吗?

我不是要求代码,我想我可以用这种链接自己做: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

但如果你有一个很好的教程(以前从未完成过AOP,只知道这个概念),我就接受了。

4 个答案:

答案 0 :(得分:13)

在Spring中有内置的支持。

我试图寻找教程,但令人惊讶的是我还没找到,所以我会尝试在这里解释一下。 (编辑:我将此示例添加到我的博客here

基本上你需要的是像这样扩展CustomizableTraceInterceptor类:

public class MyTraceInterceptor extends CustomizableTraceInterceptor {

  protected void writeToLog(Log logger, String message, Throwable ex) {
    if (ex != null) {
        logger.info(message, ex);
    } else {
        logger.info(message);
    }
  }


  protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) {
    return true;
  }
}

此类包装您的bean并输出方法调用信息,包括参数,返回值和执行时间到日志。通过更改writeToLog()方法,您可以控制输出数据的位置以及严重程度。

现在您需要一些XML来实际选择要包装的bean:

    <!-- Tracing -->

<bean name="traceInterceptor" class="MyTraceInterceptor" dependency-check="none">

    <property name="enterMessage" value="ENTER: $[targetClassShortName].$[methodName]($[arguments])"/>

    <property name="exitMessage"

              value="EXIT: $[targetClassShortName].$[methodName]() : $[invocationTime]ms : $[returnValue]"/>

</bean>

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" dependency-check="none">

    <property name="beanNames" value="*RequestListener,*Notifier"/>

    <property name="proxyTargetClass" value="true"/>

    <property name="interceptorNames">

        <list>

            <value>traceInterceptor</value>

        </list>

    </property>

    <property name="order" value="2"/>

</bean>

基本上,您在“beanNames”中定义要使用通配符包装的bean,并且“order”控制包装的顺序 - 如果您没有其他AOP类,则可以将其删除。如果更改enterMessage和exitMessage属性,也可以更改输出格式。

这应该足以让你入门。如果您需要澄清,请不要犹豫。

答案 1 :(得分:1)

AOP方法可行,但取决于您计划如何记录信息本身会影响性能 - 请注意这一点,确保日志记录尽可能高效,并确保您的错误处理它在点上你的方面。

您可能还希望看作Visual VM - 我对此工具印象深刻,它易于使用,并且能够为我提供上次使用时所需的信息。

答案 2 :(得分:1)

除了VisualVM之外,Nick还提到了另一个好的(并且可以免费开发)软件Oracle JRockit Mission Control。它的管理控制台has the ability用于简单调用某些方法的调用(加上有更多的分析选项,并且肯定比TPTP更快)。

与方法调用之前/之后的测量系统时间一样:基本上它可以工作,但有一些小的“缺陷”(例如后台应用程序可以“改变”结果)。

我个人会首先使用VisualVM或JRockit Mission Control。

答案 3 :(得分:1)

“剖析器101”的问题在于它体现了许多想法,其理由更多的是受欢迎而不是合理的思考。

最大的想法是找到性能问题的最佳方法是测量性能。

这是自上而下的想法,就像通过查看每个部门的预算来试图在政府中找到浪费。另一种选择是自下而上的方法,例如选择金钱或时间的几个随机单位,并且(最重要的)确定完全为什么每个单位花费。

如果有浪费,很快就会找到它。原因很简单,如果浪费了一些百分比(比如40%),那么样本的百分比(平均而言)就会精确地显示它是如何被浪费的。

This is the language-agnostic method I use.

补充:您可能认为像40%这样的大部分是不现实的,因为您无法想象它,but it's entirely possible