Spring @Scheduled leak

时间:2018-01-26 18:48:39

标签: java spring tomcat memory-leaks

美好的一天!我有一些休眠应用程序在独立的apache tomcat上运行。我有一个简单的任务@Scheduled注释,如下所示:

@Scheduled(fixedRate = 200000)
private void updateSettings() {
    //do some cool stuff
}

因此,当我运行我的应用程序时,我会得到类似的内容:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.scheduling.TaskScheduler' available

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.concurrent.ScheduledExecutorService' available

但它确实有效。猜猜春天会让一些牧羊人自己。 我试着解决这个问题,并在我的应用程序配置类中添加了

@EnableScheduling

@Bean
public TaskScheduler taskScheduler() {
    return new ConcurrentTaskScheduler();
}

@Bean
public Executor taskExecutor() {

    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setWaitForTasksToCompleteOnShutdown(false);

    return taskExecutor;
    //or  return new SimpleAsyncTaskExecutor(); - nothing changes
}

在我对tomcat执行./shutdown后,我收到警告

2018-01-26 21:44:02 DEBUG DisposableBeanAdapter:246 - Invoking destroy() on bean with name 
 org.springframework.context.annotation. internalScheduledAnnotationProcessor

26-Jan-2018 21:44:02.496 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [SecureChat] appears to have started a thread named [pool-4-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@9.0.1/jdk.internal.misc.Unsafe.park(Native Method)


  java.base@9.0.1/java.util.concurrent.locks.LockSupport. parkNanos(LockSupport.java:234)
 java.base@9.0.1/java.util.concurrent. locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2104)
 java.base@9.0.1/java.util.concurrent. ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1131)
 java.base@9.0.1/java.util.concurrent. ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:848)
java.base@9.0.1/java.util.concurrent. ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1092)
 java.base@9.0.1/java.util.concurrent. ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
 java.base@9.0.1/java.util.concurrent. ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
 java.base@9.0.1/java.lang.Thread.run(Thread.java:844)

正如我所看到的 - 记忆确实泄漏了。什么可以解决这个问题?

Ubuntu linux 16.04,apache tomcat 8.5,spring 5,java 9

更新: 这是一个测试项目 - 将其上传到tomcat,然后启动/停止 - 你会得到内存泄漏。

https://github.com/RedCollarPanda/spring-sheduled-bug-test

0 个答案:

没有答案