Tomcat 的运行方式部分取决于所运行的Java虚拟机的配置信息。例如:如果你没有将JVM配置成可以使用指定堆栈数量上限,则它只使用默认内存数量的上限,这可能不足以正常运行 Tomcat。
如果 Tomcat 虽然拥有正常启动的足够内存,但没有配置供连接器使用的充足进程,允许 Tomcat 执行许多并发请求,那么部分或全部的请求会得到错误响应或断开连接。
Tomcat 支持设置 JVM 启动的大量开关,主要开关如下表:
用途 | JVM选项 | 含义 |
内存设置 | -Xms256M | 设置JVM启动时堆栈内存的大小 |
内存设置 | -Xmx1024M | 设置JVM可扩展的最大堆栈内存 |
调试安全性 | -Djava.security.debug=all | 出于安全性,打开所有调试输出 |
调试 | -enableassertions | 启用assertion检查 |
调试 | -verbose:class | 启用verbose class加载调试输出 |
调试 | -verbose:gc | 启用verbose garbage collection调试输出 |
图形显示 | -Djava.awt.headless=true | 允许在没有图形显示所安装的软件的情况下运行JVM |
本地化 | -Duser.language=en | 设置Tomcat使用的绑定语言 |
本地化 | -Dfile.encoding=UTF-8 | 设置Tomcat使用的默认文件编码规则 |
网络 | -Djava.net.preferIPv4Stack=true | 配置JVM使用IPv4而不是IPv6,从而未对IPv6配置的信息不会阻止Tomcat在IPv4上以合适的方式工作。在如FreeBSD这样的一些操作系统上,Tomcat需要提供这些开关才能工作 |
合理设置 Tomcat 的堆栈和内存非常重要。如果 Tomcat 内存设置得太小会使 Tomcat 运行的很慢,或者抛出 OutOfMemoryError 错误信息,使它工作不正常。如果 Tomcat 内存设置过大,要么因不能平均分配如此大量的内存而无法启动 JVM,要么能启动运行正常,但却消耗了计算机大部分内存,导致计算机上其他软件不能正常运行。到底给 Tomcat 设置多大的内存,需要丰富的经验来决定。
因此,不管是以较小的或较大的堆栈内存配置启动 Tomcat,都会引发一些系列问题。你在访问 Tomcat 的某个页面时,其响应时间中大部分时间来自重新分配内存,所以如果你不希望出现性能相关的问题,一定要让 -Xms 和 -Xmx 开关值等于所需要内存大小,从而保证 JVM 在操作过程中从不需要重新分配堆栈内存。
在调用 CATALINA_HOME/bin 目录下的 Tomcat 脚本之前,可以设置 JAVA_OPTS 环境变量值,以设置这些 JVM 启动的任意开关。将 JAVA_OPTS 设置成包含任意开关、以空格分开的字符串。
为了可以连接远程调试器,且想以调试模式启动 Tomcat JVM,那么可以按如下方式设置 JAVA_OPTS 环境变量:
JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8088,server=y,suspend=n"
以上语句允许你通过 Tomcat 主机上的 8088 端口连接一个 JPDA 远程调试器客户端,并调试 Tomcat JVM 中运行的任何代码(注意:远程调试端口可以根据自己的喜好指定)。
如果想通过 JMX 远程客户端连接到 Tomcat 以实现本地管理和/或监控,请使用下列设置:
JAVA_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
这些设置允许你在同一台运行 Tomcat 的机器上使用 JMX 控制台(如 JDK 自带的 jconsole),如果想远程使用 JMX 控制台,则使用下列这些设置:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=8008 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.password.file=/path/to/pw/file"
这些设置允许你从另一台机器上用 TCP 8008 端口连接到 Tomcat JVM 上。你也可以设置 -Dcom.sun.management.jmxremote.authenticate=true,然后在 JMX 远程口令文件中设置 -Dcom.sun.management.jmxremote.password.file=/path/to/pw/file 路径,从而只有你及你授权的用户可以连接到 Tomcat JVM 上。
如果你的操作系统没有安装图形化软件(例如:Linux),最好设置 -Djava.awt.headless=true,从而 webapp 中包含的试图初始化 Tomcat JVM 的任何图形化代码都不会引起异常错误。
如果你要将 Tomcat 设置为使用特定语言资源绑定的场合,只要在 shell 中设置 LANG 环境变量并启动 Tomcat JVM 就可以了,如下所示:
$ LANG=en_US $ catalina.sh start
然后,Tomcat 将使用 en_US 资源绑定。
如果你选择的场合需要特定默认文件编码设置,那么或许还想设置JVM的默认文件编码。可以通过设置 -Dfile.encoding 启动开关去实现。
上面介绍了怎样去设置 JAVA_OPTS,以及常用 -D 选项的用法,下面将介绍在 Tomcat 中怎样设置 JAVA_OPTS。
这里以 catalina.bat 脚本为例,通过修改 catalina.bat 脚本实现 JAVA_OPTS 配置。例如:通过修改 catalina.bat 脚本文件,开启 Tomcat 的远程调试。脚本如下:
rem TITLE (Optional) Specify the title of Tomcat window. The default rem TITLE is Tomcat if it's not specified. rem Example (all one line) rem set TITLE=Tomcat.Cluster#1.Server#1 [%DATE% %TIME%] rem --------------------------------------------------------------------------- setlocal rem 自定义 JAVA_OPTS set "JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,address=8088,server=y,suspend=n
这里以 setclasspath.bat 脚本为例,通过修改 setclasspath.bat 脚本实现 JAVA_OPTS 配置。例如:通过修改 setclasspath.bat 脚本文件,开启 Tomcat 的远程调试。脚本如下:
rem --------------------------------------------------------------------------- rem Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings rem are valid and consistent with the selected start-up options and set up the rem endorsed directory. rem --------------------------------------------------------------------------- rem Make sure prerequisite environment variables are set set "JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,address=8088,server=y,suspend=n
其实,setclasspath.bat 脚本是在 catalina.bat 脚本中被调用的。catalina.bat 部分脚本如下:
rem Get standard Java environment variables if exist "%CATALINA_HOME%insetclasspath.bat" goto okSetclasspath echo Cannot find "%CATALINA_HOME%insetclasspath.bat" echo This file is needed to run this program goto end :okSetclasspath call "%CATALINA_HOME%insetclasspath.bat" %1 if errorlevel 1 goto end