4

我们使用拦截器来测量 bean 的公共方法调用的执行时间。然而,当一个 bean 的方法调用其他私有方法时,它似乎忽略了审计拦截器。

我们如何测量私有方法的执行时间呢?

4

3 回答 3

5

使用 AOP

您可以使用AspectJ等面向方面的编程库来实现基准测试。

例如,参见:

使用探查器

  • 您可以实现自己的代理扩展(例如,对于 JProfiler)。
  • 或者你可以放弃你的拦截器并简单地从任何探查器进行检查以捕获快照并记录执行时间。

使用 JVMTI

实际上,这就是一些分析器所做的。

您可以求助于使用JVMTI API(老实说,不完全确定这是否可行)来实现您自己的代码检查器并直接将自己挂接到 JVM。


偷偷摸摸和邪恶的内联问题

关于jb 在他的回答中(有效)的担忧,即私有方法可能在编译时或运行时内联,一些 JVM 可能不会这样做或允许禁用此功能。

  • Oracle 的 JRockit 有一个-XnoOpt选项可以禁用优化(包括这个特定的优化)。
  • Oracle/Sun 的 HotSpot 至少曾经有过-XX:-Inline(不确定它是否仍然存在或做任何事情)。

但是,这意味着当激活内联时,您无法准确测量生产中的内容。不过,对于检查您的代码可能很方便。

于 2012-06-13T15:51:58.060 回答
1

EJB 容器在调用接口方法时应用拦截器 - 您的私有方法对它是不可见的。那么使用分析工具呢?

于 2012-06-13T15:50:41.713 回答
1

那么AFAIK私有方法可以在JVM lesiure(甚至在编译时)内联,因此它们不能被分析,因为它们可能不存在于字节码中。

我想你可以标记你的方法protected——这样它们即使在生产中也不会被内联,然后对其进行分析。

如果您想分析您的测试实例,您可以尝试使用 visualvm --- visualvm 是一个非常好的选择。VisualVM 是一个图形工具,用于分析 JVM 实例,它执行所有需要的检测。http://visualvm.java.net/。此外,它是大多数 jdk 发行版中的标准工具。

于 2012-06-13T15:54:09.910 回答