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

标签 java jvm jvm-hotspot

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

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

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

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

Listening for transport dt_socket at address: XXXX

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

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

  • JMX 连接器 - 使用 JConsole 连接到进程,找到一些 MBean,详细说明使用了哪个端口。但是,我找不到任何这样的 MBean
  • RMI 注册表 - 是否可以让调试代理在 RMI 注册表中注册自己?我还没有找到任何这行得通的证据。
  • Java 代理 - 指定一个 JVM 代理,它可以拦截调试器的某些方面并获取端口详细信息,同样没有证据支持这个想法的可行性。

最佳答案

从虚拟机内部:

    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。

关于java - 识别 Java jdwp 调试器分配的(临时)端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745065/

相关文章:

java - 在 MAC 上将 Java 堆空间的最大可表示大小增加到 6GB 以上

java - 可能的 Apple JVM 错误 : java. lang.OutOfMemoryError : Java heap space at apple. awt.CRobot.getRGBPixels(CRobot.java:204)

java - 如何用 Java 编写正确的微基准测试?

java - HotSpot 堆栈防护页。红色/黄色区域及其背后的原因

java - 为什么 java.lang.Object.getClass() (和反射)比平时慢?

java - 如何使用 Java 使用 Aspose.Slides 添加通用文件类型的附件?

java - 没有获得扩展类中变量的正确值

java - 如何修改 HttpEntity 的内容

jvm - Java 虚拟机规范 (JVMS) : Bug in "5.4.5 Method overriding"

java - 如何在java中设置concurrentHashMap的并发级别