В настоящее время у нас есть запланированное задание, которое выполняется каждые 15 минут. Нам нужно запустить около 100 потоков. Каждая нить может занять от 1 до 60 минут. Максимальный размер кучи, установленный для этого приложения, составляет 2 г. Я пытался настроить параметры ThreadPoolTaskExecutor для получения оптимальной производительности, но, к сожалению, приложение продолжает падать, поскольку размер кучи продолжает увеличиваться, пока не достигнет 2g. Ниже приведена конфигурация для AsyncConfigurer
@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(50);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(Integer.MAX_VALUE);
executor.setThreadNamePrefix("TaskExecutor-");
executor.initialize();
return executor;
}
. Я понимаю, что значение corePoolSize - это количество выполняемых потоков, а установка maxPoolSize на 50 - это то, что я пытался ограничить для приложения. Меня не волнует объем очереди, потому что это фоновый сервис.
Основной вопрос: что является причиной сбоя приложения? Такое ощущение, что созданные потоки никогда не проясняются после завершения работы. Не уверен, какой будет оптимальная конфигурация для моего сценария или если я пропущу что-то еще.
Спасибо.