石英:内存泄漏?

Posted

技术标签:

【中文标题】石英:内存泄漏?【英文标题】:Quartz : Memory Leak? 【发布时间】:2011-09-28 16:13:21 【问题描述】:

我使用 Quartz 每小时运行一次作业。 servlet 在 Tomcat 上运行,我使用 ServletConextListener 来监听上下文何时被销毁。

当我关闭 tomcat 时,我收到消息:

“似乎已经启动了一个名为 [MyScheduler_Worker-1] 的线程,但未能停止它”。

但后来我看到这条消息:

“[DEBUG] 9 月 28 日上午 11:45:26.671 MyScheduler_Worker-1 [org.quartz.simpl.SimpleThreadPool]

WorkerThread 已关闭。”

那么假设这个线程没有内存泄漏是否安全?

这是我的日志的样子:

SEVERE: The web application [/*************] appears to have started a thread

named [MyScheduler_Worker-1] but has failed to stop it. This is very likely to c

reate a memory leak.

Sep 28, 2011 11:45:26 AM org.apache.catalina.loader.WebappClassLoader clearRefer

encesThreads

SEVERE: The web application [/*************] appears to have started a thread

named [MyScheduler_Worker-2] but has failed to stop it. This is very likely to c

reate a memory leak.

Sep 28, 2011 11:45:26 AM org.apache.catalina.loader.WebappClassLoader clearRefer

encesThreads

SEVERE: The web application [/*************] appears to have started a thread

named [MyScheduler_Worker-3] but has failed to stop it. This is very likely to c

reate a memory leak.

[DEBUG] 28 Sep 11:45:26.671 AM MyScheduler_Worker-2 [org.quartz.simpl.SimpleThre

adPool]

WorkerThread is shut down.



[DEBUG] 28 Sep 11:45:26.671 AM MyScheduler_Worker-1 [org.quartz.simpl.SimpleThre

adPool]

WorkerThread is shut down.



[DEBUG] 28 Sep 11:45:26.671 AM MyScheduler_Worker-3 [org.quartz.simpl.SimpleThre

adPool]

WorkerThread is shut down.

【问题讨论】:

据说Tomcat没有给Quartz足够的时间来关闭线程。但我还无法验证这一点。 【参考方案1】:

我知道这是一个旧线程,但以防其他人正在寻找它。

我们一直用于获取线程的警告,直到我们在 ServletContextListener.shutDown() 方法中添加关闭 Quartz 调度程序的代码。

关闭调度器:

            quartzScheduler.shutdown();

            int ct = 0;

            // Try waiting for the scheduler to shutdown. Only wait 30 seconds.
            while(ct < 30) 
                ct++;
                // Sleep for a second so the quartz worker threads die.  This 
                // suppresses a warning from Tomcat during shutdown.
                Thread.sleep(1000);
                if (quartzScheduler.isShutdown()) 
                    break;
                
            

【讨论】:

【参考方案2】:

您可以假设没有内存泄漏,因为您看到了线程关闭消息。但是,可以通过在关闭前清除线程来克服警告。

The shutdown-hook plugin catches the event of the JVM terminating, and calls shutdown on the scheduler.

详情:- http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigPlugins

【讨论】:

以上是关于石英:内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

MFC内存泄漏调试

如何防止java中的内存泄漏

记录一次DialogFragment 内存泄漏

常见的内存泄漏原因及解决方法

Android ValueAnimator --内存泄漏

Android内存泄漏查找和解决