Tomcat启动时需要加载大量类和资源,若JVM内存不足会导致频繁GC或内存溢出,显著延长启动时间。需调整catalina.sh(或catalina.bat)中的JAVA_OPTS参数,合理设置初始堆大小(-Xms)和最大堆大小(-Xmx),建议两者保持一致以避免堆内存动态调整的开销。例如:
export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m"
对于Java 8及以上版本,可将PermSize替换为-XX:MetaspaceSize(元空间大小)。
Tomcat启动时生成Session ID依赖操作系统的随机数生成器(/dev/random),若熵池耗尽会导致阻塞。可通过以下两种方式解决:
$JAVA_HOME/jre/lib/security/java.security文件,将securerandom.source设置为/dev/./urandom(强制使用非阻塞的/dev/urandom):securerandom.source=file:/dev/./urandom
catalina.sh中添加-Djava.security.egd=file:/dev/./urandom,覆盖默认随机数源。webapps目录下的example、doc、ROOT等默认应用无需保留,删除后可减少启动时的加载和初始化时间。server.xml中设置unpackWARs="false"(禁用自动解压WAR包)和autoDeploy="false"(禁用自动热部署);在catalina.properties中添加org.apache.catalina.startup.ContextConfig.jarsToSkip="*.jar",禁用TLD(标签库描述符)扫描,避免遍历所有JAR文件。server.xml的<Connector>标签中,设置maxThreads(最大线程数,根据服务器CPU核心数调整,如4核可设为200)、minSpareThreads(最小空闲线程数,保持50-100)、acceptCount(最大等待队列长度,设为maxThreads的1.5倍),并启用disableUploadTimeout="true"(避免上传超时报错)。例如:<Connector port="8080" protocol="HTTP/1.1"
maxThreads="200" minSpareThreads="50" maxSpareThreads="200"
acceptCount="300" disableUploadTimeout="true" />
-Xshare:on参数(需提前生成共享归档文件):export JAVA_OPTS="$JAVA_OPTS -Xshare:on -XX:+UseCompressedOops"
生成共享归档命令:$CATALINA_HOME/bin/catalina.sh -Xshare:dump。server.xml中注释或删除<Connector protocol="org.apache.coyote.http11.Http11NioProtocol">相关的WebSocket配置。web.xml中禁用JSP编译,减少编译时间。rngd服务增大熵池:sudo apt-get install rng-tools
sudo systemctl enable rng-tools
sudo systemctl start rng-tools
安装后熵池值(通过cat /proc/sys/kernel/random/entropy_avail查看)会显著增加,改善随机数生成速度。使用VisualVM、JConsole等工具监控Tomcat启动时的内存使用、线程状态和GC情况,根据监控结果进一步调整JVM参数(如更换G1GC垃圾回收器:-XX:+UseG1GC)或线程池大小,确保优化效果。
以上方案需根据实际环境(如服务器配置、应用复杂度)调整参数,建议每次修改1-2项后重启Tomcat,通过tail -f $CATALINA_HOME/logs/catalina.out观察启动时间变化,逐步找到最优配置。