Java 用JVMTI评测JVM,如何区分不同的JVM?

Java 用JVMTI评测JVM,如何区分不同的JVM?,java,jvmti,Java,Jvmti,我正在JVM TI的帮助下编写一个分析器 在C++中,我编写了一个简单的代理,它将收集到的信息写入套接字。使用JavaSwing,我构建了一个简单的GUI,它可以从套接字读取这些数据来可视化这些数据 然而,我面临一些可用性问题。我想提供根据请求开始分析Java应用程序的功能。有一种方法可以将代理注入正在运行的JVM中 但是启动一个新的Java程序并注入代理稍微复杂一点。一种方法是,调用命令行并从GUI探查器启动Java程序: java -agentlib:agent Program 我有点不喜

我正在JVM TI的帮助下编写一个分析器

在C++中,我编写了一个简单的代理,它将收集到的信息写入套接字。使用JavaSwing,我构建了一个简单的GUI,它可以从套接字读取这些数据来可视化这些数据

然而,我面临一些可用性问题。我想提供根据请求开始分析Java应用程序的功能。有一种方法可以将代理注入正在运行的JVM中

但是启动一个新的Java程序并注入代理稍微复杂一点。一种方法是,调用命令行并从GUI探查器启动Java程序:

java -agentlib:agent Program
我有点不喜欢这个主意,因为它有点老套,但我看不出有别的办法,你呢

总而言之,我需要两种方法来开始分析JVM:

  • 从头开始启动Java应用程序,并直接对其进行评测
  • 连接到正在运行的JVM并注入代理以开始分析它

  • 此外,我需要区分我检查的不同JVM,但是如何做到这一点呢?不同JVM没有唯一标识符。Attach API提供了列出不同JVM及其名称和id的可能性,但是在第一种情况下该怎么办?是否可以将参数注入代理?

    我通过使用本地进程标识(pid)和网络地址来唯一标识JVM,解决了这个问题。

    您还可以在代理加载中生成自己的GUID,并将其用于日志记录。这样,如果您的某些流程的寿命较短,而其他流程的寿命较长,则可以区分回收的PID