У меня есть конкретная тема, которую я запускаю, когда запускается приложение 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.
Любая и вся помощь оценена - я действительно хотел бы сохранить этот подход потока, а не запускать его как запланированную задачуили что-то.
Спасибо, Кьяран.