Results 1 to 3 of 3

Thread: Issue with permgen, out of memory errors; Spring / Hibernate

  1. #1

    Default Issue with permgen, out of memory errors; Spring / Hibernate

    Up to this point, I have been ignoring these errors, but it hurting my development. Basically, whenever I reload my web application (eg. through updating the configuration), I get out of memory errors, over time. For example, if I change my configuration files and the web application container restarts, after about the 3rd or 4th iteration, my server will crash.

    I am just guessing that there is some kind of memory leak and that when the container tries to close the web application, that it doesn't clear up any objects. I am assuming most of the issues are on the hibernate end, but possibly at the spring end. It is kind of a medium sized application with 40 tables.

    Possible Solutions:

    1. Increase the amount of memory at startup (I could do this, but I would like to see if there is some configuration I could set).

    I am using Spring 2 (I think a 2006 release).

    Tomcat 5.5.26.
    MySQL5

    Some of the hibernate config:
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQ LDialect</prop>

    <!-- Botlist default for show_sql should be 'false' -->
    <!-- You may also have to disable the "FORMAT SQL" in the log4j settings -->
    <!-- ============================================= -->
    <prop key="hibernate.show_sql">false</prop>
    <!-- Botlist default for format_sql should be 'false' -->
    <prop key="hibernate.format_sql">false</prop>
    <prop key="hibernate.generate_statistics">false</prop>
    <!-- ============================================= -->

    <!-- Caching Properties -->
    <prop key="hibernate.cache">true</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
    <prop key="hibernate.cache.provider_class">net.sf.ehcach e.hibernate.EhCacheProvider</prop>
    <!-- Connection Pooling Properties -->
    <prop key="hibernate.c3p0.minPoolSize">3</prop>
    <prop key="hibernate.c3p0.maxPoolSize">10</prop>
    <prop key="hibernate.timeout">1800</prop>
    </props>
    </property>


    Some of the error.

    java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java :620)
    at java.security.SecureClassLoader.defineClass(Secure ClassLoader.java:124)
    at org.apache.catalina.loader.WebappClassLoader.findC lassInternal(WebappClassLoader.java:1847)
    at org.apache.catalina.loader.WebappClassLoader.findC lass(WebappClassLoader.java:873)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1326)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1205)
    at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java :620)
    at java.security.SecureClassLoader.defineClass(Secure ClassLoader.java:124)
    at org.apache.catalina.loader.WebappClassLoader.findC lassInternal(WebappClassLoader.java:1847)
    at org.apache.catalina.loader.WebappClassLoader.findC lass(WebappClassLoader.java:873)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1326)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1205)
    at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
    at org.springframework.orm.hibernate3.HibernateTransa ctionManager.afterPropertiesSet(HibernateTransacti onManager.java:369)
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.invokeInitMethods(Abstr actAutowireCapableBeanFactory.java:1062)
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.initializeBean(Abstract AutowireCapableBeanFactory.java:1029)
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.createBean(AbstractAuto wireCapableBeanFactory.java:420)
    at org.springframework.beans.factory.support.Abstract BeanFactory$1.getObject(AbstractBeanFactory.java:2 45)
    at org.springframework.beans.factory.support.DefaultS ingletonBeanRegistry.getSingleton(DefaultSingleton BeanRegistry.java:141)
    at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:242)
    at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:156)
    at org.springframework.beans.factory.support.DefaultL istableBeanFactory.preInstantiateSingletons(Defaul tListableBeanFactory.java:290)
    at org.springframework.context.support.AbstractApplic ationContext.refresh(AbstractApplicationContext.ja va:348)
    at org.springframework.web.context.support.AbstractRe freshableWebApplicationContext.refresh(AbstractRef reshableWebApplicationContext.java:156)
    at org.springframework.web.context.ContextLoader.crea teWebApplicationContext(ContextLoader.java:246)
    at org.springframework.web.context.ContextLoader.init WebApplicationContext(ContextLoader.java:184)
    at org.springframework.web.context.ContextLoaderListe ner.contextInitialized(ContextLoaderListener.java: 49)
    at org.apache.catalina.core.StandardContext.listenerS tart(StandardContext.java:3764)
    at org.apache.catalina.core.StandardContext.start(Sta ndardContext.java:4216)
    2008-02-10 19:59:23,115 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/botlist]] - <Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListe ner>
    org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'transactionManager' defined in ServletContext resource [/WEB-INF/botlistings-servlet.xml]: Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: PermGen space
    Caused by:
    java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java :620)
    at java.security.SecureClassLoader.defineClass(Secure ClassLoader.java:124)
    at org.apache.catalina.loader.WebappClassLoader.findC lassInternal(WebappClassLoader.java:1847)
    at org.apache.catalina.loader.WebappClassLoader.findC lass(WebappClassLoader.java:873)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1326)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1205)
    at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java :620)
    at java.security.SecureClassLoader.defineClass(Secure ClassLoader.java:124)
    at org.apache.catalina.loader.WebappClassLoader.findC lassInternal(WebappClassLoader.java:1847)
    at org.apache.catalina.loader.WebappClassLoader.findC lass(WebappClassLoader.java:873)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1326)
    at org.apache.catalina.loader.WebappClassLoader.loadC lass(WebappClassLoader.java:1205)
    at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
    at org.springframework.orm.hibernate3.HibernateTransa ctionManager.afterPropertiesSet(HibernateTransacti onManager.java:369)
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.invokeInitMethods(Abstr actAutowireCapableBeanFactory.java:1062)
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.initializeBean(Abstract AutowireCapableBeanFactory.java:1029)
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.createBean(AbstractAuto wireCapableBeanFactory.java:420)
    at org.springframework.beans.factory.support.Abstract BeanFactory$1.getObject(AbstractBeanFactory.java:2 45)
    at org.springframework.beans.factory.support.DefaultS ingletonBeanRegistry.getSingleton(DefaultSingleton BeanRegistry.java:141)
    at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:242)
    at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:156)
    at org.springframework.beans.factory.support.DefaultL istableBeanFactory.preInstantiateSingletons(Defaul tListableBeanFactory.java:290)
    at org.springframework.context.support.AbstractApplic ationContext.refresh(AbstractApplicationContext.ja va:348)
    at org.springframework.web.context.support.AbstractRe freshableWebApplicationContext.refresh(AbstractRef reshableWebApplicationContext.java:156)
    at org.springframework.web.context.ContextLoader.crea teWebApplicationContext(ContextLoader.java:246)
    at org.springframework.web.context.ContextLoader.init WebApplicationContext(ContextLoader.java:184)
    at org.springframework.web.context.ContextLoaderListe ner.contextInitialized(ContextLoaderListener.java: 49)
    at org.apache.catalina.core.StandardContext.listenerS tart(StandardContext.java:3764)
    at org.apache.catalina.core.StandardContext.start(Sta ndardContext.java:4216)
    Feb 10, 2008 7:59:23 PM org.apache.catalina.core.StandardContext start
    SEVERE: Error listenerStart
    Feb 10, 2008 7:59:23 PM org.apache.catalina.core.StandardContext start
    SEVERE: Context [/botlist] startup failed due to previous errors
    2008-02-10 19:59:23,131 INFO [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/botlist]] - <Closing Spring root WebApplicationContext>

  2. #2
    Join Date
    Aug 2004
    Posts
    2,715

    Default

    This might be due to using CGLIB. Both Hibernate and Spring (when using class-based proxies only) utilize this library to dynamically generate classes at runtime. These will fill up the perm gen space and eventually cause an out of memory error.

    So if this happens quite early, I suggest to check where CGLIB-proxies are used. If created by Spring I suggest switching to Java-Reflection proxies (based on interfaces) instead.

    Regards,
    Andreas

  3. #3
    Join Date
    Jun 2006
    Location
    The Netherlands
    Posts
    13,695

    Default

    It is a known issue with Tomcat and sun JDK's especially if you also use commons-logging. There are some static references to classloaders which make it impossible to clean all the used resources, in the end you will have x instances (depending on the number of redeployments) of your app in memory.

    Use Google and you might find some solutions.

    And as Andreas pointed out depending on which type of proxies you use you run out of memory faster.
    Marten Deinum
    Java Consultant / Pragmatist / Open Source Enthousiast / Author


    Pro Spring MVC: With Web Flow
    Conspect

    Have you read the reference guide.
    Use the [ code ] tags, young padawan

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •