天天看點

tomcat transport error 202: bind failed: 位址已在使用

一、概述

啟動tomcat日志報錯
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
ERROR: transport error 202: bind failed: Address already in use
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]
看錯誤資訊可以很明顯地得出錯誤原因是端口占用,但是找遍了tomcat server.conf中監聽的端口,通過netstat -apn | grep port指令檢視,
沒有發現它們被占用。
随後通過進一步搜尋關鍵詞JDWP等可以得出是debug端口被占用了。

在catalina.sh中設定了調試啟動參數,和其他的tomcat重複了;編輯catalina.sh全局搜尋下 address=,去掉或者改一下address端口号,重新開機
tomcat      

二、補充

JPDA(Java Platform Debugger Architecture) 是 Java 平台調試體系結構的縮寫,它由三部分組成: Java 虛拟機工具接口(JVMTI),
Java 調試線協定(JDWP)以及 Java 調試接口(JDI)。

JVMTI是最底層的,由虛拟機直接提供;
JDWP則定義了調試器與被調試器之間的通信格式;
通過JDI,開發人員可以通過調試器很友善地控制被調試器的運作,像Eclips和Idea這類的開發工具就是實作了JDI。

Tomcat下開啟Debug
tomcat目錄下使用以下指令可以在JPDA下開啟debug:
bin/catalina.sh jpda start
在bin/catalina.sh檔案中我們可以看到代碼如下:
if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="8000"
  fi
  if [ -z "$JPDA_SUSPEND" ]; then
    JPDA_SUSPEND="n"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  fi
  CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
  shift
fi

通過以上代碼,我們可以發現,有三個參數可以對JPDA進行配置:

JPDA_ADDRESS:指定JPDA傳輸端口,預設是8000;
JPDA_TRANSPORT:指定JPDA傳輸協定,即調試器與虛拟機之間的資料傳輸方式,預設是dt_socket;
JPDA_SUSPEND:指定啟動後JVM是否應立即挂起執行,預設為n。
如果需要自定義JPDA,可以在catalina.sh中配置:

JPDA_TRANSPORT=dt_socket
JPDA_ADDRESS=5005
JPAD_SUSPEND=n
或者直接通過JPDA_OPTS參數進行配置:
JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

如果在catalina.sh中配置了以上這些參數,即使不通過jpda start指令啟動tomcat,也會開啟debug模式。