tomcat 6.0.35+oracle 10.0.5.0+jdk5+xfire+jdbc开发的项目,运行一段时间后就自动释放spring的bean,然后再重新加载bean。
有的时候就出现内存溢出,有的时候加载不到action,tomcat还能访问,但是不能访问项目啦。
日志:
1:启动成功的日志
17:29:54,379 INFO  [com.opensymphony.xwork2.config.providers.XmlConfigurationProvider] Parsing configuration file [struts-default.xml]
17:29:54,472 INFO  [com.opensymphony.xwork2.config.providers.XmlConfigurationProvider] Parsing configuration file [struts-plugin.xml]
17:29:54,644 INFO  [com.opensymphony.xwork2.config.providers.XmlConfigurationProvider] Parsing configuration file [struts.xml]
17:29:54,644 WARN  [org.apache.struts2.config.Settings] Settings: Could not parse struts.locale setting, substituting default VM locale
17:29:54,785 INFO  [org.apache.struts2.spring.StrutsSpringObjectFactory] Initializing Struts-Spring integration...
17:29:54,785 INFO  [com.opensymphony.xwork2.spring.SpringObjectFactory] Setting autowire strategy to name
17:29:54,785 INFO  [org.apache.struts2.spring.StrutsSpringObjectFactory] ... initialized Struts-Spring integration successfully
17:29:58,144 INFO  [com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory] Setting DefaultObjectTypeDeterminer as default ...
17:30:52,236 INFO  [com.opensymphony.xwork2.validator.ActionValidatorManagerFactory] Detected AnnotationActionValidatorManager, initializing it...2:运行一点时间就重新启动
17:28:26,179 INFO  [org.springframework.web.context.support.XmlWebApplicationContext] Closing org.springframework.web.context.support.XmlWebApplicationContext@15db13f: display name [Root WebApplicationContext]; startup date [Wed Jul 04 15:57:59 CST 2012]; root of context hierarchy
17:28:26,194 INFO  [org.springframework.beans.factory.support.DefaultListableBeanFactory] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1fa5e5e: defining beans 【加载的bean】; root of factory hierarchy
17:28:26,194 INFO  [org.springframework.orm.hibernate3.LocalSessionFactoryBean] Closing Hibernate SessionFactory
17:28:26,194 INFO  [org.hibernate.impl.SessionFactoryImpl] closing
17:28:26,210 INFO  [org.springframework.orm.hibernate3.LocalSessionFactoryBean] Closing Hibernate SessionFactory
17:28:26,210 INFO  [org.hibernate.impl.SessionFactoryImpl] closing3:catalina.log日志2012-7-18 2:41:50 org.apache.catalina.startup.HostConfig checkResources
信息: Reloading context [/项目名称]
2012-7-18 2:41:50 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/项目名称] registered the JDBC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
2012-7-18 2:41:50 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/webserviceTest] registered the JDBC driver [net.sourceforge.jtds.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
2012-7-18 2:41:50 org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap
严重: The web application [/webserviceTest] created a ThreadLocal with key of type [net.sf.retrotranslator.runtime.java.lang.ThreadLocal_.Container] (value [net.sf.retrotranslator.runtime.java.lang.ThreadLocal_$Container@72d54a]) and a value of type [java.util.WeakHashMap] (value [{net.sf.retrotranslator.runtime.java.lang.ThreadLocal_$Key@1adff28=com.opensymphony.xwork2.ActionContext@ecc347, net.sf.retrotranslator.runtime.java.lang.ThreadLocal_$Key@2465e5=[Lcom.opensymphony.xwork2.inject.InternalContext;@871f8, net.sf.retrotranslator.runtime.java.lang.ThreadLocal_$Key@1fc9fee=null}]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.

解决方案 »

  1.   

    服务器win2003+8G内存。jvm是:1.5G
      

  2.   

    是不是用jdbc的时候连接上数据库以后没有关闭连接。java语言在语法级别上是没有内存泄漏的,因为他有垃圾回收器帮忙回收,但是如果你写程序的时候用到了一些资源,一定要注意回收,比如说你用到了连接池打开了链接一定要注意关闭,不然他在内存中就老开着。比如说你打开了文件,一定要注意关闭,不关闭的话他就不会调用本地的资源把它关闭。这个其实是在本地的代码里面有,因为这样相当于java调用了c,c调用了Windows的API。c语言是需要手动调用内存的,所以这其实是java引起的。所以在语法级别上其实没有,但是在你实际中写程序的时候很有可能引起内存泄漏。
      

  3.   


    你好用的是odbc14.jar,使用hiberante和c3p0管理的连接的,出现这样的问题,查看oracle的session没有被使用的连接。
      

  4.   

    楼主项目里用倒底用jdbc还是hibernate3,还是混合在用?怎么报日志里输出有hibernate3的信息。如果不用把hibernate相关的包都删掉,可能会造成包冲突。另外启动的时候还有个小警告,在struts的xml配置文件中加
    <constant name="struts.locale" value="en_US"/> 
    或者在 struts.properties 文件加 struts.locale=en_US 
      

  5.   

    内存溢出? 是不是调下tomcat内存大小就是了
      

  6.   

    内存溢出? 是不是调下tomcat内存大小就是了
      

  7.   

    调整tomacat内存大小一、tomcat内存设置问题    在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat、jboss,weblogic)加载jar包时会出现java.lang.OutOfMemoryError异常。这主要是由于应用服务器的内存不足引起的。这种异常常有以下几种情况(以下以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理):
        1.  java.lang.OutOfMemoryError: PermGen space        PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space。从文字上看就是内存溢出,解决方法是加大内存。为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。        解决方法: 手动设置MaxPermSize大小        a.如果tomcat是以bat方式启动的,则如下设置:        修改TOMCAT_HOME/bin/catalina.sh        在“echo "Using CATALINA_BASE:    $CATALINA_BASE"”上面加入以下行:        JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m        b.如果tomcat是注册成了windows服务,以services方式启动的,则需要修改注册表中的相应键值。            打开注册表,找到目录HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\htfty\Parameters\Java,其中目录地址中红色标注的(如htfty)需要根据不同情况作修改,为tomcat服务注册成windows服务的名称。 可以看到JvmMs和JvmMx项,其中JvmMs设置最小的内存使用参数,JvmMx设置最大的内存使用参数。设置好JvmMs和JvmMx项的值,重启tomcat服务器即可生效。    建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
         2.  java.lang.OutOfMemoryError: Java heap space           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    a.如果tomcat是以bat方式启动的,则如下设置:    修改TOMCAT_HOME/bin/catalina.sh    在“echo "Using CATALINA_BASE:    $CATALINA_BASE"”上面加入以下行:    JAVA_OPTS="-server -Xms800m -Xmx800m    -XX:MaxNewSize=256m"    b.如果tomcat是注册成了windows服务,以services方式启动的,则需要修改注册表中的相应键值。            打开注册表,找到目录HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\htfty\Parameters\Java,其中目录地址中红色标注的(如htfty)需要根据不同情况作修改,为tomcat服务注册成windows服务的名称。 可以看到JvmMs和JvmMx项,其中JvmMs设置最小的内存使用参数,JvmMx设置最大的内存使用参数。设置好JvmMs和JvmMx项的值,重启tomcat服务器即可生效。提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 二、Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明,一般的JAVA程序在运行都可以通过中-Xms -Xmx来调整应用程序的初始内存和最大内存: 这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。     Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。有以下几种方法可以选用:第一种方法:Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'需要把这个两个参数值调大。例如:JAVA_OPTS='-Xms256m -Xmx512m'表示初始化内存为256MB,可以使用的最大内存为512MB。第二种方法: 环境变量中设     变量名:JAVA_OPTS     变量值:-Xms512m   -Xmx512m第三种方法:前两种方法针对的是bin目录下有catalina.bat的情况(比如直接解压的Tomcat等),但是有些安装版的Tomcat下没有catalina.bat,这个时候可以采用如下方法,当然这个方法也是最通用的方法:打开tomcatHome/\bin/\tomcat5w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initial memory pool和Maximum memory pool.Initial memory pool这个就是初始化设置的内存的大小。Maximum memory pool这个是最大内存的大小 设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。    如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。一个要注意的地方:建议把内存的最高值跟最低值的差值缩小,不然会浪费很多内存的, 最低值加大 ,最高值可以随便设,但是要根据实际的物理内存 ,如果内存设置太大了,比如设置了512M最大内存,但如果没有512M可用内存,Tomcat就不能启动,还有可能存在内存被系统回收,终止进程的情况。
      

  8.   

    hibenrate和c3p0连接的数据库源。
      

  9.   

    网上查,说是spring应用关闭了bena和sessionFacty
    。不知道怎么解决呀?请大侠们指导一下。谢谢
      

  10.   

    你用的是HibernateTemplate或者EntityManage来操作的吗?如果不是,sessionFactory.openSession以后要注意把hibernate的session关掉。