3. Java虚拟机配置
如果使用Tomcat默认配置来建设Web网站,可能会没有足够内存来响应所有的请求,并且可能会在所有客户端报错;或者有足够内存了,但是没有足够的线程,那么有些并发的访问会无法被Tomcat处理或被舍弃,造成部分客户端无法访问。下表是JVM参数说明(非Sun公司的JDK/JRE无效):
用处 JVM选项 说明
------------------------------------------------------------------------------------
内存设置 | -Xms384M | 设置JVM启动时的堆(heap)内存大小
内存设置 | -Xmx384M | 设置JVM可以扩展的最大堆(heap)内存大小
调试安全 | -Djava.security.debug=all | 打开所有有关安全的调试输出
调试 | -enableassertions | 允许声明检查(给开发人员调试代码用的)
调试 | -verbose:class | 允许类加载的详细调试输出
调试 | -verbose:gc | 允许垃圾回收器的调试输出
图像 | -Djava.awt.headless=true | 允许JVM运行在在没有安装图像显示软件的情况下
本地化 | -Duser.language=en | 设置Tomcat用户的语言包
本地化 | -Dfile.encoding=UTF-8 | 设置Tomcat用户的默认文件编码
网络 | -Djava.net.preferIPv4Stack=true | 让JVM用IPv4代替IPv6,Tomcat在FreeBSD系统下需要设置该参数
从上表可以看出,堆(heap)内存设置是最重要的。如果Tomcat的堆内存设置太小,可能会造成运行速度慢或者报出OutOfMemoryError的错误并造成不可知反应。如果设置太大了,又会浪费系统内存,甚至可能影响其他程序的正常运行。
如果Tomcat JVM的启动堆内存小而扩展内存大,那么在JVM在扩展内存时会影响Tomcat的反应,造成速度变慢,所以最好是把Xms和Xmx设置一样大小,至于具体内存大小可以根据情况进行测试和调整,后面将进一步讨论。
使用JAVA_OPTS参数来加载各种JVM启动参数,例如你想让Tomcat JVM运行在调试模式,并且远程用8000端口进行监控,可以使用:
JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
这会允许你连接一个JPDA远程调试器(例如各种Java IDE)。
如果你想通过JMX远程终端来做本地Tomcat监控的话可以:
JAVA_OPTS="-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false"
这样你可以用JMX控制台(例如JDK中带的jconsole)来连接本地Tomcat,如果需要连接远程的,则:
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"
如果你要设置Tomcat本地化语言,则:
$ LANG=en_US
$ catalina.sh start
或者用
-Duser.language=en