起動プロセス中のJVM情報を列挙する

以前に書いたアタッチAPIよりも詳細な情報にアクセスしたい場合にはsun.jvmstat.monitorパッケージを使う方法もある。(というか、恥ずかしながら最近知った)

MonitoredHost host = MonitoredHost.getMonitoredHost("localhost");
for (Object lvmid  : host.activeVms()) {
    MonitoredVm vm = host.getMonitoredVm(new VmIdentifier("//" + lvmid  + "?mode=r"));
    System.out.println();
    System.out.println("lvmid  =" + lvmid );
    System.out.println("jvmArgs = " + MonitoredVmUtil.jvmArgs(vm));
    System.out.println("commandLine = " + MonitoredVmUtil.commandLine(vm));
    System.out.println("jvmFlags = " + MonitoredVmUtil.jvmFlags(vm));
    System.out.println("mainArgs = " + MonitoredVmUtil.mainArgs(vm));
    System.out.println("mainClass = " + MonitoredVmUtil.mainClass(vm, true));
    System.out.println("vmVersion = " + MonitoredVmUtil.vmVersion(vm));
    System.out.println();
}

ちなみに、lvmid(Local Virtual Machine ID)だが、Windowsプラットホームの場合はpidと同一の値になる。

これだとコマンドラインやエントリポイントのクラスまで取得できるので、いろいろな用途に使えそうだ。
ちなみに、アタッチAPIと同様にtools.jarに依存するので、使用には注意が必要だ。(JVMの列挙は元より他のベンダーのJVMを列挙することもできないだろう)