ColdFusion的9 - 我的线程持有到内存 - 我怎么能阻止它?(ColdFusion 9

2019-09-29 03:45发布

我有我开球由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成为一个问题。

任何和所有帮助赞赏 - 我真的想保持这个线程的方法,而不是运行它作为计划任务什么的。

谢谢,夏兰。

Answer 1:

有两点建议我可以提供。 一个很玄乎,但对方是非常稳固。

有人告诉我,虽然我没有测试它,你可以提前通过指定空字符串,以他们的变量名释放对象垃圾收集。 从本质上讲,你正在减少对象的指针数。 我只看到这个在CF6.1环境中完成,所以我真的不知道这是否将适用,假设它的实际工作。

我会去了解一下什么,如果是我,是计划任务。 它不会经常(我觉得最短等待1分钟,IIRC)运行,但应该释放使用的呼叫时,任务终止任何记忆。 基本上,你只是下降的外环和睡眠(),并调用页面的正常通话。 我并不完全相信你的队列是如何工作的,但因为它是在应用程序的范围,你应该仍然可以只要访问它作为你的任务是在应用程序树(包括应用程序文件)。

根据您的其他意见,这听起来像这不是一个共享的环境。 是否有其他障碍你运行一个计划任务?



Answer 2:

如果我试图让这个我想知道什么是防止这些对象被GC的底部,我会用HPROF和HAT看什么正拉着一个问题是防止它们被gc'd的对象。

存储器GC问题的另一个原因,虽然它听起来就像是在你的情况不适用,是覆盖Object.finalize对象()。 这是因为它们必须由finaliser线程处理它们可以被回收之前,如果他们的创建速度比终结器线程可以更快地处理它们,你可能会遇到的问题MEM。



Answer 3:

我的理解是,线程使用堆栈,而不是堆,所以不存在“垃圾收集”一个线程内。 他们被留在堆,因为他们仍然在栈上。 有人纠正我,如果我错了。



Answer 4:

你可能想看看你锁定的应用范围使用。



文章来源: ColdFusion 9 - My thread is holding onto memory - how can I stop it?