Существует служба, которая подключается к базе данных Oracle для чтения данных и использует Hibernate-3.6 и SpringData-JPA-1.10.x .Часто генерируются дампы кучи, что приводит к нехватке памяти на хостах.
После анализа нескольких heapdumps с использованием Eclipse MAT обнаружил, что большая часть памяти накапливается в одном экземпляре org.hibernate.engine.StatefulPersistenceContext -> org.hibernate.util.IdentityMap -> java.util.LinkedHashMap .
И подозреваемый в утечке говорит
Поток java.lang.Thread @ 0x84427e10 ...: 29 хранит локальные переменные с общим размером 1 582 637 976 (95,04%) байтов.
Память накапливается в одном экземпляре "java.util.LinkedHashMap"загружен "".
Поиск его в StackOverflow и он говорит, что SessionFactory должен быть singleton, а session.flush () и session.clear () должны вызываться перед каждым вызовом для очистки кэша.Но SessionFactory явно не инициализируется и не используется в коде .
Что вызывает утечку памяти (похоже, что результат каждого запроса кэшируется, а не очищается) и какисправить это?
Дополнительная информация о конфигурации данных Spring:
TransactionManager инициализируется как:
<tx:annotation-driven mode='proxy' proxy-target-class='true' />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
....
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" depends-on="...">
....
</bean>
Для взаимодействия с таблицей объявляется интерфейс, расширяющий Spring Data Репозиторий и JpaSpecificationExecutor .Оба они введены в класс домена, который он будет обрабатывать.
Метод действия API имеет аннотацию @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
.