识别Java jdwp调试器分配的(临时)端口
我正在使用以下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内部或外部标识调试端口的方法,因此我可以将其记录在状态管理服务器中。
此用例有哪些可用选项?我已经考虑了以下内容,有些不高兴:
- -使用JConsole连接到该进程,找到一些MBean,其中详细说明了使用哪个端口。但是,我找不到任何这样的MBean
- -是否可以使调试代理针对RMI注册表进行注册?我尚未找到任何可行的证据。
- -指定一个JVM代理,该代理可以拦截调试器的某些方面并获取端口详细信息,再次没有证据支持该想法的可行性。
回答:
从VM内部:
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 jdwp调试器分配的(临时)端口 的全部内容, 来源链接: utcz.com/qa/410883.html