Spring-cloud-starter-hystrix和spring-cloud-starter-archaius集成的内存泄漏问题

时间:2018-03-06 08:09:15

标签: memory-leaks netflix netflix-archaius

我们正在使用spring-cloud-starter-hystrix和spring-cloud-starter-archaius,一旦战争未部署,我们就无法停止archaius的poolingconfigurationSource线程。但是spring-cloud-starter-archaius在没有hystrix的情况下工作正常,一旦战争未部署,线程就会停止。

3 个答案:

答案 0 :(得分:1)

尝试在Spring应用程序关闭之前重置Hystrix

@EnableCircuitBreaker
@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @PreDestroy
  public void cleanUp() {
    Hystrix.reset();
  }

}

答案 1 :(得分:1)

**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();
    } 

答案 2 :(得分:0)

Davin和Ashish Patel都是对的:Spring云引发了多次泄密。

Davin提出的解决方案可以部分修复名为pollingConfigurationSource的一些线程的存在。您还需要确保在类路径中没有任何名为config.properties的文件,因为com.netflix.config.sources.URLConfigurationSource(在所有情况下查看源代码)将搜索常见的patsh并启动一个exectutor线程。代码中有多个路径导致启动线程“pollingConfigurationSource”上的执行器服务(不总是停止)。在我的情况下删除“config.properties”解决了这个泄漏

我知道的其他泄漏是由Hystrix / RjJava引起的。这不会调用Histrix.reset调用rx.schedulers.Schedulers.shutdown();,而是强制线程“RxIoScheduler-”退出。