Tomcat本身的Java语言编写的,我们知道运行Java程序需要使用java
命令启动JVM,不过Tomcat把相关的命令都封装好了,作为Shell脚本放在了软件包的bin
目录下(Windows下则是bat批处理脚本),我们直接使用即可。
本篇笔记我们主要针对Tomcat常用的基本操作进行介绍。
首先我们要知道Tomcat软件包内有一个bin/catalina.sh
,Tomcat相关的操作命令最终都是调用这个脚本,不过实际上我们并不需要真的使用catalina.sh
,我们一般是使用startup.sh
和shutdown.sh
,这两个脚本会拼装一些参数并间接调用catalina.sh
。
启动Tomcat服务器:
./startup.sh
停止Tomcat服务器:
./shutdown.sh
此外,我们可以使用JDK提供的jps
命令查看Tomcat的进程号,必要时也可以直接kill
,返回例子如下。
297 Bootstrap
346 Jps
上面这个名为Bootstrap
的进程就是Tomcat,这里它的PID是297。
Tomcat启动后我们使用浏览器访问8080端口,可以看到相关页面。
在实际生产环境中,我们经常需要手动对系统参数、JVM参数等进行调整,Tomcat支持JAVA_OPTS
环境变量来接收这些参数。
设置JAVA_OPTS
最简单的方式是修改Tomcat的启动脚本,我们可以直接在catalina.sh
中加入相关的命令,下面是一个例子(Linux环境),我们设置了JVM的堆内存和元数据空间的内存。
catalina.sh
JAVA_OPTS="$JAVA_OPTS -server -Xms4096m -Xmx4096m -XX:MetaspaceSize=128m"
除此之外,我们也可以直接设置系统的JAVA_OPTS
环境变量,这种方式主要用于容器化部署的情况,我们可以在Dockerfile或k8s的部署配置文件中指定环境变量。
JConsole工具可以用于连接和查看JVM进程的内存、线程等信息,对于定位线上程序的死锁、内存泄漏等问题以及JVM调优都十分有用。如果是本地开发环境就非常简单了,直接使用JConsole连接对应的进程即可,这里不多介绍。而如果是服务器环境,我们可以为Tomcat增加相关的启动参数,使Tomcat启动时暴露RMI协议端口,以便工具远程连接。
我们可以在JAVA_OPTS
中添加以下启动参数:
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
注意这里具体使用时,我们需要把hostname
换成对应服务器的IP。
除此之外,如果是k8s容器环境,这里我们就无法填写hostname
主机名了,因为k8s调度下的容器IP不是固定的。此时的最佳解决方案是这样的:我们主机名还是写127.0.0.1
,同时使用kubectl
命令,将容器内端口映射到本地,来实现JMX的远程连接。映射命令例子如下:
.\kubectl.exe --kubeconfig ./config port-forward -n dev order-687998bc67-srmjr --address 0.0.0.0 1099:1099
有关监控具体可以参考JMX相关章节。
有时我们会遇到十分棘手的bug,本地无法复现或没有测试条件,但在服务器环境上就会出现。此时我们可以使用远程断点调试的方式,解决此类尴尬的问题。我们在JAVA_OPTS
中添加以下启动参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
此时我们可以使用Eclipse进行远程JVM的调试连接。
在Eclipse中,我们创建一个Debug Configuration
,并选择Remote Java Application
,输入调试端口对应的IP和端口号,此时就可以进行远程断点调试了。