spring-cloud-starter-hystrix 和 spring-cloud-starter-archaius 集成的内存泄漏问题
Memory Leak Issue with spring-cloud-starter-hystrix and spring-cloud-starter-archaius integration
我们正在使用 spring-cloud-starter-hystrix 和 spring-cloud-starter-archaius,一旦 war 是,我们就无法停止 archaius 的 poolingconfigurationSource 线程未部署。但是 spring-cloud-starter-archaius 在没有 hystrix 的情况下工作正常,一旦 war 未部署,线程就会停止。
尝试在 Spring 应用程序关闭之前重置 Hystrix
@EnableCircuitBreaker
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@PreDestroy
public void cleanUp() {
Hystrix.reset();
}
}
**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();
}
Davin 和 Ashish Patel 都是对的:Spring 云造成多处泄漏。
一些名为 pollingConfigurationSource
的线程的存在可以通过 Davin 提出的解决方案部分修复。您还需要确保在您的类路径中没有任何名为 config.properties
的文件,因为 com.netflix.config.sources.URLConfigurationSource
(查看所有情况的源代码)将搜索公共 patsh 并启动执行程序线程。代码中有多个路径导致线程 "pollingConfigurationSource" 上的 executorservice 启动(并不总是停止)。在我的例子中,删除 "config.properties" 解决了这个泄漏
我知道的另一个泄漏是由 Hystrix/RjJava 引起的。而不是调用 Histrix.reset
调用 rx.schedulers.Schedulers.shutdown();
这将强制线程 "RxIoScheduler-" 退出。
我们正在使用 spring-cloud-starter-hystrix 和 spring-cloud-starter-archaius,一旦 war 是,我们就无法停止 archaius 的 poolingconfigurationSource 线程未部署。但是 spring-cloud-starter-archaius 在没有 hystrix 的情况下工作正常,一旦 war 未部署,线程就会停止。
尝试在 Spring 应用程序关闭之前重置 Hystrix
@EnableCircuitBreaker
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@PreDestroy
public void cleanUp() {
Hystrix.reset();
}
}
**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();
}
Davin 和 Ashish Patel 都是对的:Spring 云造成多处泄漏。
一些名为 pollingConfigurationSource
的线程的存在可以通过 Davin 提出的解决方案部分修复。您还需要确保在您的类路径中没有任何名为 config.properties
的文件,因为 com.netflix.config.sources.URLConfigurationSource
(查看所有情况的源代码)将搜索公共 patsh 并启动执行程序线程。代码中有多个路径导致线程 "pollingConfigurationSource" 上的 executorservice 启动(并不总是停止)。在我的例子中,删除 "config.properties" 解决了这个泄漏
我知道的另一个泄漏是由 Hystrix/RjJava 引起的。而不是调用 Histrix.reset
调用 rx.schedulers.Schedulers.shutdown();
这将强制线程 "RxIoScheduler-" 退出。