簡體   English   中英

哪個 Java 線程監聽哪個端口?

[英]Which Java thread listens to which port?

我有一個在 Linux 上的 OpenJDK 1.8.0 上運行的 Tomcat 9.0.60 服務器,其中netstat -ltpn|grep java顯示它偵聽的端口數量超過了配置的端口:

tcp        0      0 0.0.0.0:37917           0.0.0.0:*               LISTEN      50384/java          
tcp        0      0 10.100.0.188:39780      0.0.0.0:*               LISTEN      50384/java          
tcp        0      0 10.100.0.188:41415      0.0.0.0:*               LISTEN      50384/java          
tcp        0      0 0.0.0.0:34476           0.0.0.0:*               LISTEN      51139/java          

(我從該列表中刪除了所有配置的端口。)

所以我認為幾個應用程序也打開了他們監聽的“他們自己的”套接字。 我想找出每個端口,哪個 Java 線程正在偵聽,這樣我就可以進一步找出應用程序,也許它是否仍然需要,或者只是開發人員忘記的剩余一個。

到目前為止,我試圖通過 JMX 連接來了解VisualVM的內容,但沒有走得很遠——可能是因為我的經驗不夠。

你能給我任何提示 - 或者可能是一個完整的解決方案 - 我如何找出端口到線程映射?

我不需要自動執行此操作,它更像是偶爾進行的文檔和檢查手動工作。

如果我要弄清楚 Java 線程在聽什么,我會嘗試以下方法:

  1. 在 Web 應用程序代碼庫中搜索使用ServerSocket類的 Java 代碼,然后返回到負責的應用程序代碼。

  2. 使用jstack (或類似工具)捕獲所有 Java 線程堆棧的快照。 然后掃描它們以查找在調用accept方法時被阻塞的線程。

  3. 使用帶有-K選項的lsof來獲取監聽線程的線程 ID。 然后使用jstack如何通過已知的 PID/TID 獲取 JVM 線程名稱/id中描述的技術將線程 id 映射到 Java 線程。

在 Java 線程中獲取 Java 線程的 Linux 線程 ID 涉及使用本機代碼。 但我不認為你需要達到那個水平來獲得你需要的信息。


我很困惑你為什么要這樣做。 這類信息不太可能幫助您調試 web 應用程序。 如果您這樣做是因為您懷疑存在安全問題……請您的開發人員“請解釋”意外的 TCP / 偵聽意外的端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM