錯誤堆疊:
INFO: Illegal access: this web application instance has been stopped already.
Could not load org.springframework.core.NestedExceptionUtils...
at com.xxx.task.ticket.TicketTreatmentWork$3.run(TicketTreatmentWork.java:410)
伴隨大量:
SEVERE: The web application [/APP] appears to have started a thread named [Timer-0] but has failed to stop it.
This is very likely to create a memory leak.
@WebListener
public class AppLifecycle implements ServletContextListener {
private static ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent sce) {
scheduler = Executors.newSingleThreadScheduledExecutor(r -> {
Thread t = new Thread(r, "AppScheduler");
t.setDaemon(true); // 守護線程,JVM 退出自動結束
return t;
});
// 註冊業務定時任務...
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
if (scheduler != null) {
scheduler.shutdownNow(); // 立即中斷所有任務
try { scheduler.awaitTermination(5, TimeUnit.SECONDS); }
catch (InterruptedException ignored) {}
}
// 關閉其他線程池、連接池、Timer...
}
}
<!-- 註銷這兩個 Listener 可暫時消除錯誤,但不解決根因 -->
<!-- <Listener className="org.apache.catalina.core.AprLifecycleListener" /> -->
<!-- <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> -->
警告:註銷 `JreMemoryLeakPreventionListener` 會失去 JVM 級內存洩漏防護(如 JDBC 驅動註銷、ThreadLocal 清理),**僅作臨時調試**,生產必須在代碼層正確關閉線程。