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-" 退出。