5

jps ツールの機能をプログラムで再作成する必要があります。そのプロセスにアタッチできるように、すべての Java 実行プロセスをその ID とともに見つける必要があります (JConsole と同様)。

VirtualMachine API が役立つと思っていましたが、次を実行しても期待どおりの結果が得られませんでした

public class ProcessList {
    public static void main(String[] args){
        List<VirtualMachineDescriptor> vms = VirtualMachine.list();
        for(VirtualMachineDescriptor vm : vms){
            System.out.println (vm.id());
        }
    }
}

上記のコードを実行すると、1 つの ID だけが返されますが、同じマシンで jps を実行すると、他のプロセスがいくつか表示されます。

4

3 に答える 3

8

jpsMonitoredHostOracle/Sun JRE の内部クラスを使用します。このactiveVMs()メソッドは、ホスト上のすべてのアクティブな VM のリストを取得するために使用されます。sun.tools.jps.JpsOpenJDKのクラスのソースを参照して、jpsツールが内部でどのように機能するかを確認できます。

于 2011-10-10T13:11:37.477 に答える
5

これは正しい API です。最終的に「MonitoredHost#activeVMs()」と「VirtualMachine.list()」は、jstat テクノロジを介して同じ検出コードを使用します。別のユーザーとしてコマンド ラインで jps を実行しますか? その場合、別の JVM が表示されます。

JPSの実装方法はこちらをご覧ください。

于 2011-10-10T13:31:39.650 に答える
1

次のことができます: 1) プラットフォーム固有のスクリプト ファイル (Windows の場合は .bat、Linux の場合は .sh など) を作成します。プロセス (Java プロセスを取得するために結果をパイプします)。3) ランタイムの API を使用して上記のスクリプトを起動し、出力結果を取得します。

于 2011-10-10T13:15:33.380 に答える