识别 Java jdwp 调试器分配的(临时)端口

Identify Java jdwp Debugger Assigned (Ephemeral) Port

我正在使用以下 JVM 参数通过 hostpot 调试器启动 JVM。

-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0

请注意,我正在分配端口零,以便 JVM 向 OS 请求临时端口。这对我的用例至关重要,以确保 JVM 不会因争用某些预定义端口而无法启动。

结果我的 JVM 启动了,下面的日志条目被输出到 stdout:

Listening for transport dt_socket at address: XXXX

我想找到一些方法来识别 JVM 内部或外部的调试端口,这样我就可以将其记录在状态管理服务器中。

此用例有哪些选项可用?我考虑了以下内容,但并不高兴:

也许你可以从什么开始。

netstat -tlnp

这为您提供了侦听本地 TCP 端口的所有进程的列表。例如:

tcp    0    0 0.0.0.0:35688     0.0.0.0:*     LISTEN   26733/java
35688 - the ephemeral port
java  - the program name which is listening
26733 - the PID of the process 

如果您需要 java 进程的更细粒度,您可以使用 ps 来收集有关进程的信息。

ps x -p 26733

可以 return 类似

26733 pts/1 0:00 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0 Scratch

从虚拟机内部:

    Properties props = sun.misc.VMSupport.getAgentProperties();
    System.out.println(props.getProperty("sun.jdwp.listenerAddress"));

来自外部申请:

    VirtualMachine vm = com.sun.tools.attach.VirtualMachine.attach(PID);
    try {
        Properties props = vm.getAgentProperties();
        System.out.println(props.getProperty("sun.jdwp.listenerAddress"));
    } finally {
        vm.detach();
    }

两者都不是标准的一部分。仅适用于 OpenJDK / Oracle JDK.