2010-10-14 18 views
8

Wydaje się, że mam wyciek pamięci, jednym z winowajców wydaje się być ConnectionProperty, bez względu na to, czy jest to String, Int czy Boolean. np .: com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty, miliony wydają się przebywać w pobliżu i nie być GC'd.

Oto moje ustawienia dla DB, fabryki sesji Hibernate oraz łączenie itd ..:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" 
     value="jdbc:mysql://${dbHostName}:${database.port}/${database.name}" /> 
    <property name="username" value="${database.username}" /> 
    <property name="password" value="${database.password}" /> 
</bean> 
<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<aop:config> 
      <aop:pointcut id="pcut" expression="execution(* com.package.data..*.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" ref="pcut" /> 
</aop:config> 
<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 


<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="current_session_context_class">thread</prop> 
      <prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.connection.release_mode">after_transaction</prop> 

      <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> 
      <prop key="c3p0.acquire_increment">1</prop> 
      <prop key="c3p0.min_size">20</prop> 
      <prop key="c3p0.max_size">200</prop> 
      <prop key="c3p0.timeout">300</prop> 
      <prop key="c3p0.max_statements">50</prop> 
      <prop key="c3p0.idle_test_period">300</prop> 

      <prop key="hibernate.generate_statistics">true</prop> 

     </props> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      <value>...beans...</value> 
     </list> 
    </property> 
</bean> 

punktu przekroju wynosi:. „Wykonanie (* com.package.data .. (..)) ". Zmodyfikowałem wszelkie oczywiste nazwy itp.

Tak jak mówię, właśnie dostajemy setki takich na kupie, które nie są zbierane, i nie mam pojęcia, dlaczego i gdzie zacząć szukać.

Aplikacja jest wdrażana przez WAR, ze sterownikiem DB znajdującym się we współużytkowanym katalogu lib Tomcats. Używamy Tomcat6 lub tcServer, ale oba mają te same problemy.

Jakieś pomysły?

+1

Każde połączenie ma 40-50 ustawialnych właściwości i trzymasz co najmniej 20 z nich, dlaczego jest to zaskakujące? Czy faktycznie rośnie bez ograniczeń, gdy maszyna pozostaje w górze, czy jest stabilna w "setkach na setkach"? Używanie dużej ilości pamięci to nie to samo, co wyciekanie pamięci. – Affe

+0

FWIW, widzę ten sam problem na zupełnie innym silniku aplikacji (WebCluster). Tysiące klas MySQL ConnectionPropertiesImpl zagnieżdżonych w każdym cyklu naszego obiektu interfejsu SQL. –

Odpowiedz

0

Spróbuj tych dwóch:

  1. zestaw przyłączeniowy łączenie Min/Max rozmiar 0 lub 1. Czy nadal rosnąć?
  2. W zależności od narzędzia profilowania spróbuj śledzić ścieżkę od obiektu do jego głównego katalogu głównego.