一、概述

启动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模式。