Tomcat启动错误PermGen space

tomcat中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)那么就会产生此错误信息了。 解决方法: 手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh在

echo "Using CATALINA_BASE:   $CATALINA_BASE"

上面加入以下行:

JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m

建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

共享方法:

配置shared lib

       打开进入tomcat/conf/目录。打开catalina.properties配置文件,修改两个地方

1、找到shared.loader=位置,设置共享目录地址

 

[html] view plain copy

  1. shared.loader=${catalina.base}/shared/lib,${catalina.base}/shared/lib/*.jar  

 

2、找到common.loader位置,并追加shared lib目录地址

[html] view plain copy

  1. common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.base}/shared/lib,${catalina.base}/shared/lib/*.jar  

 

3、自行创建${catalina.base}/shared/lib,${catalina.base}/shared/lib/路径,并将共享的jar类包放在该目录下

     特别说明:jar共享目录可以在tomcat目录下,也可以自行定义一个绝对路径。如果是相对路径只能相对于${catalina.base}/。实现jar共享方式在以上shared.loader和common.loader中任选一种即可,不过个人倾向于使用shared.dir方式。

       补充:toncat类加载机制

 

  • Commonclassloader:负责装载$CATALINA_HOME/common目录下的所有类和jar包,详细的配置可参考$CATALINA_HOME/conf/catalina.properties文件中的common.loader配置;该classloader装载的类对于Server class loader和Webapp class loader是可见的;Commonclass loader在Tomcat启动时创建,其parent classloader是System class loader;
  • Server classloader:负责装载Tomcat的核心类,位于$CATALINE_HOME/server目录下的所有类和jar,可由catalina.propreties中的server.loader配置指定;它在Tomcat启动时被创建,其parent loader是Commonclass loader;
  • Sharedclass loader:负责装载webapp公用的类,可以用户通过catalina.properties文件中的shared.loader属性来指定;它在Tomcat启动时被创建,其parentloader也是Common class loader;
  • Webappclassloader:这个比较特殊,它只负责加载各自app中WEB-INF/classes以及WEB-INF/lib下的类;其parentloader虽然是Shared class loader,但其加载策略和默认的类加载机制不太一样;

 

       No Spring WebApplicationInitializer types detected on classpath

         这个是因为spring 3.1以后在加载前会自动先扫描,查找WebApplicationInitializer的实现类

 

 

[html] view plain copy

  1. <listener>    
  2.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
  3. </listener>   
  4. <context-param>  
  5.      <param-name>contextConfigLocation</param-name>  
  6.      <param-value>classpath:applicationContext.xml</param-value>  
  7. </context-param>  

         如果自行定义加载,不需要自动扫描,可以通过metadata-complete="true"关闭自动扫描

[html] view plain copy

  1. <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"  
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  4. metadata-complete="true">   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值