我有我开球由CF9应用程序启动时特定线程。 它管理着一个队列,并从队列中取出的物品进行处理。 如果没有项目从队列中它会采取sleep()
该线程可以住几个星期,加工和睡眠等。
我遇到的问题是,我从队列中获得的项目被保留在堆(看起来像老一代)我跟他们做了很久之后。
一个完整的垃圾收集是由JVM大约每隔一小时做(我可以从JConsole中告诉这个),即使在运行我已经处理项目仍然会保留在堆上。 我可以告诉大家,因为我做了jmap
堆转储和使用内存分析工具Eclipse插件进行分析。
因此,这里是我的代码,这是在执行Application.cfc
:
<!--- Kick off a new thread and run through the queue --->
<cfthread action="run" name="myThread">
<cfloop condition="APPLICATION.threadProcessing eq true">
<cfif APPLICATION.myQueue.hasNext()>
<!--- Get next item --->
<cfset tmpItem = APPLICATION.myQueue.next() />
<!--- Ask item to process itself --->
<cfset tmpItem.process() />
<!--- PROBLEM: these 'tmpItem' objects are never cleaned up by the garbage collector! --->
<!--- Then we sleep for an interval - this is to stop us hogging server resources --->
<cfset sleep(2000) />
<cfelse>
<!--- Nothing in the queue, so sleep for a while... --->
<cfset sleep(10000) />
</cfif>
</cfloop>
</cfthread>
谁能告诉我,如果我使用不正确的范围还是什么? 有没有办法迫使我的临时对象的清理? 我推测,因为它没有被清理反正调用一个明确的垃圾收集是行不通的。
这仅出现当我们从CF8搬到CF9成为一个问题。
任何和所有帮助赞赏 - 我真的想保持这个线程的方法,而不是运行它作为计划任务什么的。
谢谢,夏兰。