【发布时间】:2011-05-11 10:42:04
【问题描述】:
对于我使用JVMTI 实现的分析器,我想开始测量所有Java 方法的执行时间。 JVMTI 提供事件:
MethodEntryMethodExit
所以这很容易实现,但是我在 API 中遇到了这个note:
启用方法进入或退出事件会显着降低许多平台上的性能,因此不建议用于性能关键的用途(例如分析)。在这些情况下应使用字节码检测。
但是我的分析代理无头工作,这意味着收集的数据被序列化并通过套接字发送到显示结果的服务器应用程序。我应该如何使用字节码检测来实现这一点。我有点困惑如何从这里继续。如果我必须改变策略或者我该如何解决这个问题,有人可以向我解释一下吗?
【问题讨论】:
-
听起来您想创建自己的分析器。我建议你看看现有的配置文件是如何工作的,比如 VisualVM 和 YourKit,看看它们是否不能满足你的需求。
-
他们愿意,我只想自己做。但是 VisualVM 可能是一个提示,看看他们是如何做到的,但我有根据的猜测是他们使用 Java 代理而不是本机代理。
-
VisualVM 使用 Java 代理,您可以获取其源代码。 YourKit 使用您无法获取源代码的本地代理。记录数据并不像正确可视化数据那么难。我会看看 YourKit 是如何进行可视化的。
-
下一步是可视化,我的意思是我可以使用命名的 JVMTI 事件 MethodEntry 和 MethodExit 来看看,如果没有检测,差异有多大,但是,我仍然想这样做正确的方法。到目前为止,我看不到如何使用类方法来收集数据并将这些数据发送到套接字,就像我现在在本机代码中一样。
-
我认为你会遇到很多麻烦,因为它可能不如专业的解决方案,但是......当你创建一个代理时,你可以定义一个@987654325 @ 传递了一个
Instrumentation,它获取加载的每个类的所有字节码。它也可以用于稍后重新加载类。您可以使用 ObjectWeb ASM 之类的库来更改要插入的字节码,以用于方法、字段等(任何您喜欢的)的计时器/计数器代码,并将其存储在 POJO 数据结构中,您可以通过普通 Socket 发送该数据结构。跨度>
标签: java measurement execution-time jvmti