<Context path="/demo" docBase="E:\webdemo" reloadable="true"/> //conf\server.xml
<Context reloadable="true"> conf\context.xml
//web.xml false 改成true
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
//tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager"/>
<role rolename="xdfuser"/>
<role rolename="admin"/>
<user username="xdf" password="xdf" roles="xdfuser"/>
<user username="tanyitian" password="admin" roles="admin"/>
</tomcat-users>
tomcat最大线程数的设置
Tomcat的server.xml中连接器设置如下
1. <Connector port="8080"
2. maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
3. enableLookups="false" redirectPort="8443" acceptCount="100"
4. debug="0" connectionTimeout="20000"
5. disableUploadTimeout="true" />
[/code]
tomcat在配置时设置最大线程数,当前线程数超过这个数值时会出错,那么有没有办法捕获到这个错误,从而在client端显示出错信息?
2. 如何加大tomcat连接数
在tomcat配置文件server.xml中的<Connector />配置中,和连接数相关的参数有:
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。
web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。tomcat5中的配置示例:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
对于其他端口的侦听配置,以此类推。
3. tomcat中如何禁止列目录下的文件
在{tomcat_home}/conf/web.xml中,把listings参数设置成false即可,如下:
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
4.如何加大tomcat可以使用的内存
tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
需要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,可以使用的最大内存为512MB
最近在熟悉一个开发了有几年的项目,需要把数据库从mysql移植到oracle,首先把jdbc的连接指向mysql,打包放到tomcat里面,可以跑起来,没有问题,可是当把jdbc连接指向oracle的时候,tomcat就连续抛java.lang.OutOfMemoryError的错误,上网google了一下,了解了一下tomcat的运行机制,也解决了问题,share出来,以备查。
1、首先是:java.lang.OutOfMemoryError: Java heap space
解释:
Heap size 设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:
手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
Java代码
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
或修改catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
2、其次是:java.lang.OutOfMemoryError: PermGen space
原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
1. 手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在Java代码
“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
catalina.sh下为:
Java代码
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
另外看到了另外一个帖子,觉得挺好,摘抄如下:
分析java.lang.OutOfMemoryError: PermGen space
发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。
但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生。
于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!
对于以上两个问题,我的处理是:
在catalina.bat的第一行增加:
Java代码
set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
在catalina.sh的第一行增加:
Java代码
JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
关于tomcat总是内存溢出
1.将tomcat/bin目录下的catalina.sh文件加上这两行:
JAVA_OPTS='-server -Xms512m -Xmx512m -XX:PermSize=32M -XX:MaxNewSize=128m -XX:MaxPermSize=64m -Djava.awt.headless=true'
CATALINA_OPTS="-server -Xms256m -Xmx256m"
设置一下资源大小。
2.如果配了apache的一定要把url转发的转发规则定好,不能全部转发给tomcat去处理。
图片,样式,js等要发给apache去处理:
JkMount /*不能有,有些apache配置了workers.properties的就去掉[uri:/*.jsp]worker=ajp13:localhost:8009
context=/
针对杭州数字电视系统内存溢出的问题,对tomcat做了两种监控方式。
注:以下配置都配置到catalina.sh文件中。
一、gclog,这种方式用于观察内存回收情况,显示的内容如下所示:
211847: [GC 211847: [DefNew: 57509K->1728K(57664K), 0.0321256 secs] 281236K->225664K(523712K), 0.0322686 secs]
212394: [GC 212394: [DefNew: 57663K->1308K(57664K), 0.0330551 secs] 281600K->225730K(523712K), 0.0332203 secs]
212951: [GC 212951: [DefNew: 57244K->1469K(57664K), 0.0277455 secs] 281666K->225899K(523712K), 0.0278909 secs]
如何配置gc log,下面是几个常用的gclog的配置:
1、打开gclog,这个步骤是必须的:
JAVA_OPTS="$JAVA_OPTS -verbose:gc"
2、显示gclog中的时间戳,可选:
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCTimeStamps"
3、打印gclog的详细信息,可选:
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails"
4、配置gclog的日志文件路径(路径为自定义),必选:
JAVA_OPTS="$JAVA_OPTS -Xloggc:/traindvb/dvbtrain/tomcat/gclogs/gc.log"
5、重启tomcat。
如何观察:
以下面这段为例:
212951: [GC 212951: [DefNew: 57244K->1469K(57664K), 0.0277455 secs] 281666K->225899K(523712K), 0.0278909 secs]
主要以两个箭头为参考(->)
第一个箭头:57244K->1469K,箭头指向的是新生段的内存占用情况;
第二个箭头:281666K->225899K,箭头指向的是回收后的内存占用情况。
圆括号中通常指的是当前申请的内存大小。
二、heap dump监测方法。这种方式用于抓取当时tomcat的运行的各模块的内存占用情况,显示的内容通常如下:
16400 [char 8192 "..............................................................."
24 java.util.HashMap$Entry
56 java.net.URL
56 java.net.URL
32 sun.misc.URLClassPath$JarLoader
24 java.lang.String
24 java.lang.String
24 java.lang.String
24 java.lang.String
80 [java.util.HashMap$Entry
前面的数字表示占用的字节数。
如何配置:
1、将动态库libheapprofile.so,放到/usr/lib/目录下;
2、在catalina.sh文件中加入如下配置:
JAVA_OPTS="$JAVA_OPTS -Xrunheapprofile"
3、重启tomcat即可。
如何观察:
当通过观察gclog,发现内存已经溢出或,内存占用已经超过正常值很多时(
以杭州dtvoss为例:日常占用在600-700M,较高时会在1500M左右,通常页面上只要能够正常使用,内存还是正常的,
但是如果内存达到1800M-2000M,则视为已经溢出),执行kill -3 [java pid]。
此时(有可能要等1-2分钟),会在$TOMCAT_HOME/bin下生成一个heap.dump文件,这个文件通常要过10分钟左右
才能完全生成(判断是否已经生成的办法是,观察这个文件的大小是否还在改变,如果大小停止变化了,则说明已经生
成好了)。
文件生成后,用 cut -f 2 <heap.dump | sort -n | uniq -c | sort -n 对该文件进行分析,统计内存中各个类的数量。
可参考的文档:
http://www.mail-archive.com/cocoon-dev@xml.apache.org/msg31401.html
最近新上的一个项目,tomcat老是内存溢出。搜索到了两篇文章,先记下来做参考。