我们正在创建一个Spring Boot Web应用程序。
DB:JDBC模板和DBCP连接池。
Java代码:在Executors.newSingleThreadScheduledExecutor();中调用可运行对象
时间间隔:2分钟
可运行代码中的代码使用JDBCTemplate.query()命中数据库。
问题:堆使用率在几分钟内增加到几个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”的一个实例中累积的。