Java5 で、jconsoleのようにローカルのJVMにJMXで接続する。

jconsoleだとローカルのJVMのプロセスIDが表示されてJMX経由で接続することができるがこの方法は一般的に公開されていないので調べていた。今回久し振りにJMXを触っていてこのコードを探していたのでその一部を公開。

接続できるVMを取得する。 ajvmに格納されるのはプロセスIDでローカルで起動しているJVMが格納されている。

 Set<Integer> ajvm;
 MonitoredHost host = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null));
 ajvm = host.activeVms();

JMXのアドレスを取得する。ajvmに格納されているプロセスIDはローカルで起動しているJavaVMの一覧で、アドレスを取得した際にnullを返すものは、-Dcom.sun.management.jmxremote を指定していないものなので接続できない。さらに(接続する際には不要だが)起動時のコマンドラインを取得する。

 for (Integer vm : ajvm) {
  String address = ConnectorAddressLink.importFrom(vm);
  if (address == null) {
   continue;
  }
  VmIdentifier vmId = new VmIdentifier(vm.toString());
  String cmdLine = MonitoredVmUtil.commandLine(host.getMonitoredVm(vmId));
 }

このサンプルは、プロセス一覧の取得例であるが、このコードを参考にすればプロセスIDからJMXアドレスが取得できるので、JMXServiceURLクラスを利用してJMXアクセスすることができるだろう。