Tomcat教程

Java VM配置

Tomcat的运行方式部分取决于所运行的Java虚拟机的配置信息。例如,如果您没有将 JVM配置成可以使用指定堆栈的数量上限,则它只用默认内存数量的上限,这讨能不足 以让您运行Web应用程序。如果Tomcat在启动时没有足以运行webapp的内存,它会给所 有Web客户端提供error页。如果tomcat虽有启动webapp的充足内存,但没有与已配置好 的连接器相等的充足进程,允许Tomcat执行许多并发请求,那么部分或全部的请求会得 到error响应或断开连接。

您可以设置JVM启动的大量开关。表2-1是笔者选择的一些有用启动开关设置,您可以在 运行Tomcat时使用这些设置。

表2-1: Java VM配置选项

用途 JVM选项 含义
内存设置 -Xmx384M 设置JVM启动时堆栈内存的大小
内存设置 -Xmx384M 设置JVM可扩展的最大堆栈内存
调试安全性 -Djava.security.debug=all 出于安全性,打开所有调试输出
调试 -enableassertions 启用 assertion 检査
调试 JVM选项 启用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 配置的信息不会阻止Tomcat在Ipv4上以合适的方式工作。在如FreeBSD这样的一些操作系统上,Tomcat需要提供这些开关才能工作

堆栈设置无疑是要适当理解和设置的最重要环节。过度严格的内存设置要么使Tomcat运 行很慢,要么报OutOfMemoryError的错误信息,使工作不正常。内存设置过大,要么因 不能平均分配如此大ft的内存而无法启动JVM,要么能启动运行正常,但却耗用了超出 所需的过量计算机内存,而且计算机上的其他软件也无法运行(因为必要的内存已分配 给Tomcat)。表2-1显示的-Xmx和-Xms设置值为384MB,但这不一定是计算机的适用内 存,即使是适用的,也未必就足Tomcat所要的内存大小。到底多大内存是最适合的,需 要经验来决定不冋内存的大小。

以小的和大的启动堆栈内存配置TomcatJVM,都会引发网页响应时间超出Java VM堆栈 的最大值的某种问题(如果需要堆栈也跟着增长)。因为Tomcat正在提供响应时会占用 大量的时间重新分配内存,所以如果您不希望性能出现类似的问题,一定要让-Xms和Xmx 开关值就是所需内存的相同大小,从而保证JVM在操怍过程中从不需要重新分配堆桟内 存。

在调用驻留于CATALINA_HOME的Tomcat脚本之前,可以设置JAVA_OPTS环境变量 值,以设置这些JVM启动的任意开关。将JAVA_OPTS设置成包含任意开关、以空格分开的字符串为了可以连接远程调试器,且想以调试模式启动TomcatJVM,那么可以按如下方式设罝 JAVA_OPTS环境变量:

JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket, address=80000,server=y, suspend=n"

以上语句允许您通过Tomcat主机上的8000端口连接一个JPDA远程调试器客户端(例 如,任何Java IDE),并调试Tomcat JVM中运行的任何代码。您可随意定制所喜欢的端口号。

如果想通过JMX远程客户端连按到Tomcat以实现本地管理和/或监控,请使用下列设置:

JAVA_OPTS="-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxrenote.ssl=false \ 
-Dcom.sun.management.jmxremote.authenticate=false"

这些设置允许您在同一台运行Tomcat的机器上使用JMX控制台(如JDK自带的 jconsole),如果想远程使用JMX控制台,则使用下列这些设置:

JAVA_0PTS="-Dcom.sun .management.jmxremote.port=8008 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.management.jmxremote.authenticate=false \  
-Dcom.sun.management.jmxremote. password.file=/path/to/pw/file"

这些设置允许您从另一台机器上用TCP 8008端口连接到Tomcat JVM上。您也可以设置 -Dcom.sun.management.jmxrenote.authenticate=true,然后在JMX远程口令文件中设 -Dcom.sun.management.jmxremote.password.file=/path/to/pw/file路径,从而只有您及您授权的用户可以连接到Tomcat JVM上。

如果您要将Tomcat设置为使用恃定语言资源绑定的场合,只要在shell中设置LANG环境变量并启动Tomcat JVM就可以了,如下所示:

$ LANG=en_US 
$ catalina.sh start

然后,Tomcat将使用en_US资源绑定。如果实际情况并非如此,则一定存在某种原因导 致了这一结果,您可以设置-Duser.language=en。如果您选择的场合需要特定默认文件编码设置,那么或许还想设置JVM的默认文件编码,您可以通过设置-Dfile.encoding启 动开关完成这一任务。

一定要读一读java命令的手册页,因为它提供了有关所有这些开关具体用途的详细信息,并提供了每个开关可供使用的值。

如Sun的JDK和JRE那样,一些非Sun品牌的JDK或JRE java命令并不支持以上全部启动开 关,因为他们的启动开关在Java语言或VM规范中是不标准的。这大概是一件槽糕的事 情,因为启动Java VM的参数可用T.Java运行时和Java语宫的可编程接口。启动开关以-X 开头,意味着使用最常用的JVM执行细节(不指望它们工作在其他JVM上,但要使用少量非常通用的开关,如-Xms和-Xmx)。因为脚本和其他程序依赖于某个启动开关,所以 其他JVM实现者则致力于使其java命令能被合理解释并使用这些相同启动开关,如果相 同版本的Sun JVM一样,如果他们支持相同启动开关行为,那么在与其他品牌的JDK或 JRE一同使用时,早期为Sun JDK成JRE开发的一些脚本会产生故障。如果您使用了不同 品牌的JRE,那么您会遇到这一类的问题,尤其是其他老版本的JDK/JRE。但是,在其 他Java实现者认识到让这些开关在所有Java运行时上冏样都能工作有多重要时,这一性 能最近已得到改进。

关注微信获取最新动态