読者です 読者をやめる 読者になる 読者になる

3.別プロセスのVMに接続 - jconsoleの仕組み

プロセスIDからデータを取得する箇所は?

// jdk/src/share/classes/sun/tools/jconsole/JConsole.java:844
    public static void main(String[] args) {
// ...
// jdk/src/share/classes/sun/tools/jconsole/JConsole.java:924
                    int vmid = Integer.parseInt(arg);
                    LocalVirtualMachine lvm =
                        LocalVirtualMachine.getLocalVirtualMachine(vmid);
                    if (lvm == null) {
                        System.err.println("Invalid process id:" + vmid);
                        return;
                    }
                    vms.add(lvm);

vmidからローカルのVMのオブジェクトが取れる?
vmidはたぶんプロセスIDの事だろう.
 

// jdk/src/share/classes/sun/tools/jconsole/LocalVirtualMachine.java:198
    public static LocalVirtualMachine getLocalVirtualMachine(int vmid) {
// ...
// jdk/src/share/classes/sun/tools/jconsole/LocalVirtualMachine.java:212
            String name = String.valueOf(vmid); // default display name to pid
            try {
                VirtualMachine vm = VirtualMachine.attach(name);

VirtualMachine.attach(<プロセスID>)でVMが.attachって何だ?
 

VirtualMachine.attachのドキュメント

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

Java 仮想マシンに接続します。
このメソッドは、AttachProvider.providers() メソッドを呼び出すことで、接続プロバイダのリストを取得します。

AttachProvider.providers()が実際にVMのオブジェクトと接続できる所か?
と思ったが色々読むとAttachProvider.attachVirtualMachine()がVMと接続する所みたいだ.

AttachProvider.attachVirtualMachineのドキュメント

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

Java 仮想マシンに接続します。
Java 仮想マシンは抽象識別子によって識別されます。この識別子の特性はプラットフォームによって異なりますが、多くの場合、プロセス識別子 (pid) の文字列表現になります。
このメソッドは、識別子を解析し、その識別子を Java 仮想マシンマッピングします。

このメソッドはabstractだった.つまりこれを実装しているサブクラスがどこかにあるはず.
 

AttachProviderの実装クラス探し

絶対ファイル名のsuffixに"AttachProvider"ってあるはず.

$ find . -name "*AttachProvider.java"
./jdk/src/share/classes/com/sun/tools/attach/spi/AttachProvider.java
./jdk/src/share/classes/sun/tools/attach/HotSpotAttachProvider.java
./jdk/src/solaris/classes/sun/tools/attach/SolarisAttachProvider.java
./jdk/src/solaris/classes/sun/tools/attach/LinuxAttachProvider.java
./jdk/src/windows/classes/sun/tools/attach/WindowsAttachProvider.java

LinuxAttachProviderが見つかった.これを読んでいこう.