【问题标题】:Memory Leak - com.mysql.jdbc.ConnectionPropertiesImpl$*ANY*ConnectionProperty内存泄漏 - com.mysql.jdbc.ConnectionPropertiesImpl$*ANY*ConnectionProperty
【发布时间】:2010-10-14 21:55:41
【问题描述】:

我似乎有内存泄漏,罪魁祸首之一似乎是 ConnectionProperty,无论是 String、Int 还是 Boolean。例如:com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty,数以百万计的人似乎留在附近而不是被 GC。

这是我对数据库、会话工厂、休眠和池等的设置:

<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>

切入点是:“execution(* com.package.data...(..))”。我已经删除了任何明显的名字等。

正如我所说,我们只是在堆上收集了数百个没有被收集的,我不知道为什么,也不知道从哪里开始寻找。

应用程序通过 WAR 部署,数据库驱动程序位于 Tomcats 共享库目录中。我们正在运行 Tomcat6 或 tcServer,但两者都显示相同的问题。

有什么想法吗?

【问题讨论】:

  • 每个连接有 40-50 个可设置的属性,而您至少持有 20 个,为什么这令人惊讶?究竟是随着机器不停地在无限增长,还是稳定在“百上千”?使用大量内存与泄漏内存不同。
  • FWIW,我在完全不同的应用程序引擎(WebCluster)上看到了同样的问题。数以千计的 MySQL ConnectionPropertiesImpl 嵌套类在我们的 SQL 接口对象的每个循环中泄漏。

标签: java mysql hibernate spring memory-leaks


【解决方案1】:

试试这两个:

  1. 将连接池的最小/最大大小设置为 0 或 1。它还会增长吗?
  2. 根据您的分析器工具,尝试跟踪从对象到其 GC 根的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    • 2011-03-22
    • 2015-04-20
    相关资源
    最近更新 更多