Мы создаем загрузочное веб-приложение Spring.
БД: Шаблон JDBC и пул соединений DBCP.
Java-код: исполняемый файл вызывается в Executors.newSingleThreadScheduledExecutor ();
Временной интервал: 2 мин
Код в исполняемом файле обращается к БД с помощью JDBCTemplate.query ().
Проблема: использование кучи увеличивается до нескольких ГБ за несколько минут.
Любые указатели были бы полезны для выявления утечки памяти.
Примечание: Если мы прокомментируем 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.apache.commons.pool.impl.GenericObjectPool" загружен "org.springframework.boot.loader.LaunchedURLClassLoader @ 0x7fc8d0101"занимает 1 421 543 264 (94,69%) байта.Память накапливается в одном экземпляре "org.apache.commons.pool.impl.GenericObjectPool", загруженном "org.springframework.boot.loader.LaunchedURLClassLoader @ 0x7fc1d90124c8".