1

我们正在创建一个 Spring Boot Web 应用程序。

DB:JDBC 模板和 DBCP 连接池。

Java代码:在Executors.newSingleThreadScheduledExecutor()中调用了一个runnable;

时间间隔:2分钟

runnable 中的代码使用 JDBCTemplate.query() 命中 DB。

问题:堆使用量在几分钟内增加到几 GB。

任何指针都有助于识别内存泄漏。

注意:如果我们注释 JDBCTemplate.query() ,内存使用是不变的。

DBCP 的设置:

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
            <property name="url" value="${batch.jdbc.url}" />
            <property name="username" value="******" />
            <property name="password" value="******" />
            <property name="connectionProperties" value="defaultRowPrefetch=10000;defaultBatchValue=200;" />
            <property name="minIdle" value="10" />
             <property name="maxIdle" value="12" />
            <property name="maxActive" value="100" />
            <property name="accessToUnderlyingConnectionAllowed" value="true" />
            <property name="initialSize" value="${batch.jdbc.pool.size}"/>

            <property name="validationQuery" value="select 1 from dual" />
            <property name="validationQueryTimeout" value="5" />
            <property name="timeBetweenEvictionRunsMillis" value="120000" />
            <property name="minEvictableIdleTimeMillis" value="60000" />             
            <property name="testOnBorrow" value="true" /> 
        </bean>

来自 Eclipse MAT 报告的嫌疑人

由“org.springframework.boot.loader.LaunchedURLClassLoader @ 0x7fc1d90124c8”加载的“org.apache.commons.pool.impl.GenericObjectPool”的一个实例占用了 1,421,543,264 (94.69%) 字节。内存在“org.springframework.boot.loader.LaunchedURLClassLoader @ 0x7fc1d90124c8”加载的“org.apache.commons.pool.impl.GenericObjectPool”的一个实例中累积。

4

0 回答 0