2011-04-07 54 views
2

我正在用JVM TI的幫助編寫一個分析器。使用JVMTI分析JVM,如何區分不同的JVM?

在C++中,我編寫了一個簡單的代理,它將收集的信息寫入套接字。使用Java Swing,我構建了一個簡單的GUI,它從套接字讀取這些數據以將其可視化。

但是我面臨一些可用性問題。我想提供功能來根據請求開始分析Java應用程序。有Attach API,它提供了將代理注入運行 JVM的的可能性。

但是啓動一個新的Java程序並注入代理有點複雜。一種方法是,使以命令行的呼叫,並開始從GUI事件探查器的Java程序:

java -agentlib:agent Program 

我挺不喜歡這個想法,因爲它是某種哈克,但我看不出有什麼別的辦法, 你做?

總之我需要兩種方法啓動剖析JVM:

  1. 開始從從零開始一個Java applicatiom並開始分析它直接
  2. 附加到一個正在運行的JVM和注射劑開始剖析它

此外,我將需要區分我檢查的不同JVM,但如何做?沒有用於不同JVM的唯一標識符。 附加API給出了列出不同JVM的可能性,其名稱ID,但在第一種情況下該怎麼辦?是否可以注入代理論據

回答

1

我通過使用本地進程標識(pid)和網絡地址來唯一標識JVM來解決問題。

2

您也可以在Agent_OnLoad中生成自己的GUID並將其用於日誌記錄。通過這種方式,如果你的一些過程有短暫的生命,而其他的過程則可以區分回收的PIDS。