ColdFusion 9 - Моя тема держится за память - как я могу это остановить? - PullRequest
1 голос
/ 26 августа 2010

У меня есть конкретная тема, которую я запускаю, когда запускается приложение 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.

Любая и вся помощь оценена - я действительно хотел бы сохранить этот подход потока, а не запускать его как запланированную задачуили что-то.

Спасибо, Кьяран.

Ответы [ 4 ]

2 голосов
/ 26 августа 2010

Есть два совета, которые я могу предложить. Один довольно сомнительный, а другой довольно солидный.

Мне сказали, хотя я и не проверял это, что вы можете освобождать объекты для сборки мусора на ранних этапах, назначая пустую строку их имени переменной. По сути, вы уменьшаете количество указателей на объект. Я видел это только в среде CF6.1, так что я действительно не уверен, применимо ли это, предполагая, что это действительно работает.

Что бы я посмотрел, если бы это был я, это запланированное задание. Он не будет запускаться так часто (я думаю, что минимальное ожидание составляет 1 минуту, IIRC), но должен освободить всю память, используемую вызовом, когда задача завершается. По сути, вы просто отбрасываете внешний цикл и функцию sleep () и вызываете страницу как обычный вызов. Я не совсем уверен, как работает ваша очередь, но, поскольку она находится в области приложения, вы все равно сможете иметь к ней доступ, если ваша задача находится в дереве приложения (или включает этот файл приложения).

Судя по вашим другим комментариям, это не общая среда. Существуют ли другие препятствия для выполнения запланированного задания?

0 голосов
/ 17 января 2014

Насколько я понимаю, потоки используют стек, а не кучу, поэтому в потоке нет "сборки мусора".Они сохраняются в куче, потому что они все еще в стеке.Кто-нибудь поправит меня, если я ошибаюсь.

0 голосов
/ 26 августа 2010

Если бы я пытался разобраться в этом, я хотел бы знать, что мешает этим объектам быть gc, я бы использовал hprof и HAT , чтобы увидеть, что былодержитесь за объекты, которые мешали им быть gc'd.

Другая причина проблем с gc памяти, хотя это звучит так, как будто она не применяется в вашем случае, это объекты, которые переопределяют Object.finalize (),Это , потому что они должны быть обработаны потоком финализатора, прежде чем их можно будет восстановить, и если они созданы быстрее, чем поток финализатора может их обработать, вы можете столкнуться с проблемами mem.

0 голосов
/ 26 августа 2010

Возможно, вы захотите заблокировать использование области приложения.

...