我正在使用以下JVM参数来启动主机调试程序的JVM。
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0
请注意,我正在分配端口0,以便JVM向操作系统请求临时端口。这对我的用例至关重要,以确保JVM不会因为某些预定义端口的争用而无法启动。
结果我的JVM启动,并将以下日志条目输出到stdout
:
Listening for transport dt_socket at address: XXXX
我想找到一些方法来识别JVM内部或外部的调试端口,因此我可以将它记录在状态管理服务器中。
此用例有哪些可用选项?我已经考虑了以下几点,但没什么乐趣:
答案 0 :(得分:9)
从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。
答案 1 :(得分:0)
也许你可以开始。
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
可以返回类似
的内容 26733 pts/1 0:00 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0 Scratch