Проблема утечки памяти с интеграцией пружина-облако-стартер-hystrix и пружина-облако-стартер-архай
Мы используем Spring-Cloud-Starter-Hystrix с Spring-Cloud-Starter-Archaius, где мы не можем остановить поток poolingconfigurationSource Archaius, как только война не будет развернута. Но Spring-Cloud-Starter-Archaius работает нормально без Hystrix, и поток прекращается, когда война не развернута.
3 ответа
**Issue resolved permanently.**
**There are 2 approach :**
1) Create ContextListener in Servlet and in destroy method , copy below code.
2) If you are using Histrix + Spring Boot + Archaius then on main spring application java file , copy below code in method annonated with @PreDestory annotations.
**Solution :**
try {
if (ConfigurationManager.getConfigInstance() instanceof DynamicConfiguration) {
DynamicConfiguration config = (DynamicConfiguration) ConfigurationManager.getConfigInstance();
config.stopLoading();
} else if (ConfigurationManager.getConfigInstance() instanceof ConcurrentCompositeConfiguration) {
ConcurrentCompositeConfiguration configInst = (ConcurrentCompositeConfiguration) ConfigurationManager
.getConfigInstance();
List<AbstractConfiguration> configs = configInst.getConfigurations();
if (configs != null) {
for (AbstractConfiguration config : configs) {
if (config instanceof DynamicConfiguration) {
((DynamicConfiguration) config).stopLoading();
break;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
Попробуйте переустановить Hystrix до закрытия приложения Spring.
@EnableCircuitBreaker
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@PreDestroy
public void cleanUp() {
Hystrix.reset();
}
}
И Дэвин, и Ашиш Патель правы: из-за весеннего облака произошли многочисленные утечки.
Наличие некоторых потоков с именем pollingConfigurationSource
может быть частично исправлено решением, предложенным Давиным. Вы также должны убедиться, что ни один файл не назван config.properties
в вашем классе, потому что com.netflix.config.sources.URLConfigurationSource
(ищите в источнике все случаи), найдите общий патч и запустите ветвь exectutor. в коде есть несколько путей, которые приводят к запуску executorservice в потоке "pollingConfigurationSource" (который не всегда останавливается). В моем случае удаление "config.properties" решило эту утечку
Другая известная мне утечка вызвана Hystrix/RjJava. Вместо звонка Histrix.reset
вызов rx.schedulers.Schedulers.shutdown();
это заставит потоки "RxIoScheduler-" выйти.