Java 我可以从JVM内部知道jdwp传输端口吗?

Java 我可以从JVM内部知道jdwp传输端口吗?,java,remote-debugging,jdwp,Java,Remote Debugging,Jdwp,我用以下参数启动java: -Xdebug-Xrunjdwp:transport=dt\u套接字,地址=0,服务器=y,挂起=n 我得到以下输出: 监听地址为59183的传输dt_插座 在不读取标准输出的情况下,是否可以从同一JVM中找到端口?为什么要将端口设置为0?通常,您会使用address参数将端口设置为所需的任何端口 导入lombok.extern.slf4j.slf4j; 导入org.apache.commons.lang3.StringUtils; 导入java.lang.refle

我用以下参数启动java:
-Xdebug-Xrunjdwp:transport=dt\u套接字,地址=0,服务器=y,挂起=n

我得到以下输出:
监听地址为59183的传输dt_插座


在不读取标准输出的情况下,是否可以从同一JVM中找到端口?

为什么要将端口设置为0?通常,您会使用address参数将端口设置为所需的任何端口

导入lombok.extern.slf4j.slf4j;
导入org.apache.commons.lang3.StringUtils;
导入java.lang.reflect.Method;
导入java.util.Properties;
@Slf4j
公共类运行时调试器{
静态私有int jdwpListenerPort;
静态公共int getJdwpListenerPort(){
如果(jdwpListenerPort==0){
jdwpListenerPort=readJdwpListenerPort();
}
返回jdwpListenerPort;
}
静态私有int readJdwpListenerPort(){
字符串listenerAddress=null;
试一试{
Class theClass=Class.forName(“sun.misc.VMSupport”);
方法m=class.getMethod(“getAgentProperties”);
属性p=(属性)m.invoke(null);
listenerAddress=p.getProperty(“sun.jdwp.listenerAddress”);
if(listenerAddress!=null){
listenerAddress=StringUtils.substringAfter(listenerAddress,“:”);
返回整数.parseInt(listenerAddress);
}
}捕获(例外情况除外){
log.error(“读取sun.jdwp.listenerAddress失败,忽略”);
}
返回-1;
}
}

我希望它有一个空闲端口,这样它就不会失败。稍后我将连接到该端口。@ohadshai——在哪里有文件证明使用0作为端口会导致它使用开放端口?我不知道是否有文件证明,但您可以在问题中看到结果。这是绑定端口时的正常行为。我看到该约定在别处有文档记录,尽管它没有作为runjdwp或agentilb内容的一部分记录:
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Method;
import java.util.Properties;

@Slf4j
public class RuntimeDebugger {

    static private int jdwpListenerPort;

    static public int getJdwpListenerPort() {
        if(jdwpListenerPort == 0) {
            jdwpListenerPort = readJdwpListenerPort();
        }
        return jdwpListenerPort;
    }

    static private int readJdwpListenerPort() {
        String listenerAddress = null;
        try {
            Class<?> theClass = Class.forName("sun.misc.VMSupport");
            Method m = theClass.getMethod("getAgentProperties");
            Properties p = (Properties) m.invoke(null);
            listenerAddress = p.getProperty("sun.jdwp.listenerAddress");
            if (listenerAddress != null) {
                listenerAddress = StringUtils.substringAfter(listenerAddress, ":");
                return Integer.parseInt(listenerAddress);
            }
        } catch (Exception ex) {
            log.error("Failed to read sun.jdwp.listenerAddress, ignore");
        }
        return -1;
    }
}