Я программирую приложение с последней версией Spring Boot. Я недавно стал проблемой с растущей кучей, которая не может быть собрана мусором. Анализ кучи с Eclipse MAT показал, что в течение часа после запуска приложения куча выросла до 630 МБ и с Hibernate SessionFactoryImpl, используя более 75% всей кучи.
Я искал возможные источники вокруг кэша Query Plan, но единственное, что я нашел, это то, но это не играло. Свойства были установлены следующим образом:
spring.jpa.properties.hibernate.query.plan_cache_max_soft_references=1024
spring.jpa.properties.hibernate.query.plan_cache_max_strong_references=64
Запросы базы данных генерируются маской Spring Query, используя интерфейсы репозитория, как в этой документации. С этим методом генерируется около 20 различных запросов. Нет других родных SQL или HQL. Образец:
@Transactional
public interface TrendingTopicRepository extends JpaRepository<TrendingTopic, Integer> {
List<TrendingTopic> findByNameAndSource(String name, String source);
List<TrendingTopic> findByDateBetween(Date dateStart, Date dateEnd);
Long countByDateBetweenAndName(Date dateStart, Date dateEnd, String name);
}
или
List<SomeObject> findByNameAndUrlIn(String name, Collection<String> urls);
как пример использования IN.
Вопрос: почему кеш-план запроса продолжает расти (он не останавливается, он заканчивается полной кучей) и как предотвратить это? Кто-нибудь сталкивался с подобной проблемой?
Версии:
- Spring Boot 1.2.5
- Спящий режим 4.3.10