[英]Identify Java jdwp Debugger Assigned (Ephemeral) Port
我使用以下JVM參數來啟動主機調試程序的JVM。
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0
請注意,我正在分配端口零,以便JVM向操作系統請求臨時端口。 這對我的用例至關重要,以確保JVM不會因為某些預定義端口的爭用而無法啟動。
結果我的JVM啟動,並將以下日志條目輸出到stdout
:
Listening for transport dt_socket at address: XXXX
我想找到一些方法來識別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。
也許你可以開始的東西。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.