调整 Tomcat JVM 参数

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。

Tomcat 配置 JAVA_OPTS

编辑 catalina.bat / catalina.sh 脚本

这里以 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.sh 脚本

这里以 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
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号