分析 vs 仪器化 - Java

4
基本问题:JVM提供JVMTI作为用于分析和调试JVM的本地API。JVM仪器化也可以做到这一点(正确吗?)。如果是,两者之间有什么区别?

通常,性能分析器使用Instrumentation来获取额外的信息。调试器只使用JVMTI。但是,您也可以使用Instrumentation进行自己的调试,例如记录关键方法调用。 - Peter Lawrey
我认为分析工具仅依赖于JVMTI。如果它们也使用instrumentation(这是用于JVM监控的Java API),那么JVMTI是否不支持该功能?换句话说,更一般的问题是,既然有JVMTI,为什么还需要instrumentation呢? - Sandeep Jindal
@Sandeep Jindal - 显然它们是不同的,而且显然它们做不同的事情。为什么不直接查看各自的API呢?(这个问题有点像“大象和阿司匹林之间的区别是什么?”) - Stephen C
@Stephen 不确定这两个东西是否像大象和阿司匹林一样不同。我的理解是两者都可以用于分析。一个提供本地API,另一个提供Java API。我的问题是在什么情况下应该使用哪个! - Sandeep Jindal
@Sandeep Jindal - 如果你想编写自己的分析器,你需要了解两个API,这样你就知道哪一个提供了你想要呈现给工具用户的信息的哪些部分。你需要亲自阅读规范! - Stephen C
顺便提一下,这不是一个基础问题。几乎没有人编写自己的JVMTI工具... - Stephen C
3个回答

3

我认为Instrumentation和JVMTI并不是包含关系,因为它们都可以独立使用。

JVMTI基于事件,我们可以在事件处理程序中获取有关JVM的所需信息。

Instrumentation是一种修改字节码的技术,在类加载到JVM之前,我们可以在需要的位置动态添加额外的代码。当执行这段额外的代码时,将帮助收集分析器所需的信息。

可以使用各种第三方jar(如ASM)来实现Instrumentation。

据我了解和经验,这两种技术都用于Java性能分析,而不是本地性能分析。

也许需要阅读更多文档并尝试不同的示例以获得更好的理解。


0
JVMTI提供了调试器所需的所有功能,但如果您需要更多JVMTI提供的功能,您需要使用Instrumentation。

我认为JVMTI提供了所有需要进行分析的内容。除了JVMTI,仪器化是否还提供了其他功能? - Sandeep Jindal
我不知道具体性。调试器随JDK一起提供,JVMTI支持它。直到最近,分析器是独立的,每个分析器都提供不同的功能。要使用调试器,必须在调试模式下启动JVM。对于分析器,这并非必需。 (我建议您不要尝试同时执行两者,因为这会影响您的结果) - Peter Lawrey
除了调试器之外,如果两种技术相似,我应该在什么时候使用哪一种?感到困惑 :( - Sandeep Jindal
1
如果您想进行调试,请使用调试器。如果您想进行性能分析,请使用性能分析器。除非您已经同时使用了这两个工具,并且非常理解它们如何工作以及它们不能满足您的需求,否则仪器化(Instrumentation)很可能是您需要的。也就是说,您很少会在JVMTI中找到无法使用调试器或性能分析器完成的任务。 - Peter Lawrey
好的,让我们这样问问题。我想编写自己的分析器。我应该使用JVMTI还是Java Instrumentation? - Sandeep Jindal
1
在这种情况下,两者都使用。当JVMTI能够满足您的需求时,请使用它。 - Peter Lawrey

0
JVMTI是提供所有调试、分析等各种事件的基础功能...它所提供的一个领域是可以访问拦截(和重新定义)类。java.lang.instrument是在JVMTI之上的Java包装器,提供了一种好的、简单易用的方式来获取类加载事件。
将JVMTI视为java.lang.instrument的纯超集,但需要用户编写C代码。

JVMTI规范涵盖了基于本地C的代理(-agentlib,-agentpath)和基于Java的代理(-javaagent)。 - William Louth
William,在我看来这不正确,但我们已经深入到语义学的领域了,所以我不会追究太远。我认为规范应该是http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html,并且在那个级别上没有提到-javaagent。 - Trent Gray-Donald
让我重新表述一下...在开发旨在取代JVMPI的JVMTI期间,工程团队试图引入两种执行BCI的方法:一种是通过C语言访问的本地版本,另一种是Java API版本。 - William Louth
这项工作是由于需要协调两种类型代理的课程负载钩子/事件而共同进行的,尽管我不确定是否曾经定义过如何进行排序(或由用户定义)。 - William Louth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接