簡體   English   中英

ColdFusion 9-我的線程正在占用內存-如何停止它?

[英]ColdFusion 9 - My thread is holding onto memory - how can I stop it?

我有一個由CF9應用程序啟動時啟動的特定線程。 它管理一個隊列,並從隊列中取出項目以對其進行處理。 如果沒有要從隊列中取出的項目,它將進入sleep() 該線程可以生存數周,處理和休眠等。

我遇到的問題是,從隊列中取出的項目在完成處理后很長一段時間就被保留在堆中(看起來就像在舊一代中一樣)。

JVM大約每小時進行一次完整的垃圾收集(我可以從jConsole得知),即使在運行時,我已處理的項目仍保留在堆中。 我之所以可以這樣說是因為我做了一個jmap堆轉儲,並使用Memory Analysis Tool 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時,這似乎才成為問題。

感謝所有幫助-我真的很想保留這種線程方法,而不要將其作為計划任務或其他方式運行。

謝謝,Ciaran。

我可以提供兩條建議。 一個很不友善,但另一個很堅實。

有人告訴我,盡管我還沒有測試過它,但是可以通過將空字符串分配給變量名稱來將其釋放到垃圾回收中。 本質上,您正在減少對象上的指針計數。 我只在CF6.1環境中看到過此操作,因此我真的不確定它是否適用(假設它確實有效)。

如果是我,我要調查的是計划任務。 它不會經常運行(我認為最小等待時間是1分鍾,IIRC),但是應該在任務終止時釋放調用所使用的所有內存。 基本上,您只需刪除外循環和sleep(),然后以正常調用的方式調用頁面。 我不能完全確定隊列的工作方式,但是由於它在應用程序范圍內,因此只要您的任務在應用程序樹中(或包括該應用程序文件),您仍然應該能夠訪問它。

根據您的其他評論,聽起來這不是共享環境。 您執行預定任務還有其他障礙嗎?

我的理解是線程使用堆棧而不是堆,因此線程內沒有“垃圾回收”。 它們被保留在堆中,因為它們仍在堆棧中。 如果我錯了,任何人都可以糾正我。

如果我想深入了解這個問題,我想知道是什么阻止了這些對象成為gc,那么我將使用hprofHAT來查看阻止這些對象成為gc的對象的原因。

內存gc問題的另一個原因,盡管聽起來似乎不適用於您的情況,但是是覆蓋Object.finalize()的對象。 這是因為必須先由終結器線程處理它們,然后才能回收它們;如果創建它們的速度比終結器線程處理它們的速度快,則可能會遇到內存問題。

您可能需要考慮鎖定對Application范圍的使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM