Tomcat用了two years+,没有深究过配置信息,只是简单的改改端口,最近在搭建测试Server的时候,单机有四个Tomcat实例,发现8G的内存不知不觉的就被用完了,甚至是20G的硬盘都被一次意外吃完了,内存是因为Tomcat中添加了最大内存2G最小1G,硬盘是因为Jenkins的Tomcat出现大量异常,打印了10+G的log(contains catalina.out),后来去掉内存设置,感觉当时内存却是少了不少,Tomcat的自带日志也直接关闭,后来日志打印是正常关闭了,但是内存,还是认为偏高,因为是测试,所以对性能要求不是很高,后来开始了解Tomcat的参数配置,网上的信息太繁杂,没有得到一个满意的answer,另外,其实个人比较偏向于官方的默认配置,而且网上的资料大都是人云亦云,就简单的JAVA_OPTS/CATALINA_OPTS配置来说,网上都说添加配置到catalina.sh,但是与Tomcat官方的说法,有两点出入(${CATALINA_HOME}/
RUNNING.txt
):
0配置信息添加到${CATALINA_HOME}/bin/setenv.sh
1不推荐使用JAVA_OPTS,因为stop等命令也会使用该配置,应使用CATALINA_OPTS
另外关闭Tomcat的自带日志,通过spring mvc的interceptor来记录RuntimeException,避免丢失未捕获的异常纪录。
JAVA VM args:-server
0查看默认参数:
$ java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
uintx AdaptivePermSizeWeight = 20 {product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx InitialHeapSize := 66328448 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 1063256064 {product}
uintx MaxPermSize = 67108864 {pd product}
uintx PermSize = 16777216 {pd product}
java version "1.6.0_24"
$ java -client -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
uintx AdaptivePermSizeWeight = 20 {product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx InitialHeapSize := 16777216 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 268435456 {product}
uintx MaxPermSize = 67108864 {pd product}
uintx PermSize = 12582912 {pd product}
java version "1.6.0_24"
通过JMC查看Tomcat运行的内存占用,如图:
JAVA8后,内存结构发生变化,具体的暂时没有进行调研,走一个简单的记录,分别对应如下参数:
-Xmx768M -Xms768M 设定初始化和最大的Heap
-XX:ReservedCodeCacheSize=128M 设定Code Cach
-XX:MaxMetaspaceSize=128M 设定Metaspace
-XX:CompressedClassSpaceSize=256M 设定Compressed Class Space
具体参数的大小与性能的影响,暂时不确定,待更新
PS:default-jvm-and-java-arguments