tomcat 配置


<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老是内存溢出。搜索到了两篇文章,先记下来做参考。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值