[英]The web application appears to have started a thread named but has failed to stop it. This is very likely to create a memory leak
[英]The web application [VehicleRouting] appears to have started a thread named [drools-worker-4] but has failed to stop it
我使用optaplanner構建了車輛路由Web應用程序。 當我嘗試將Web應用程序部署到tomcat 8服務器並嘗試從Web瀏覽器運行它時,它會在tomcat日志文件中生成警告。 日志中有一些關於我的Web應用程序的信息啟動了一個線程,但未能將其停止,這可能會導致內存泄漏。 我寫了一個destroy方法,其中我的ExecutorService對象將調用shutdown方法來確保啟動的每個線程都被終止。 這是我的代碼:
public class OptimizerService implements IOptimizerService {
private ExecutorService executor;
@Override
public synchronized Boolean startSolving() throws Throwable {
executor = Executors.newFixedThreadPool(2);
...
}
...
// other methods
...
@PreDestroy
public synchronized void destroy() {
executor.shutdown();
}
}
但是,為什么我仍然在tomcat日志中得到那些警告? 這是tomcat日志:
09-Jun-2017 08:25:56.377 WARNING [http-nio-18081-exec-295] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [VehicleRouting] appears to have started a thread named [drools-worker-4] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
任何意見將不勝感激。 謝謝並恭祝安康。
executor.shutdownNow();
中斷線程 ,但是executor.shutdown();
才不是。 后者只是等到任務完成,如果您有運行2h的求解器,那么祝您好運...
如果Solver
檢測到其線程被中斷,它將終止(與正常的Termination
幾乎相同),后者KieSession.dispose()
調用KieSession.dispose()
。 我假設dispose()
負責處理所有流口水產生的線程。
至少這是理論:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.