Вопрос

Гуглеры, если у вас есть свалка кучи с корнем coldfusion.runtime.CFDummyComponent читать дальше.

Обновление 2/22/2011.

Marc Eser из славы MXUNIT нашел точно такой же ошибку в другом контексте. Отказ Его решение включает в себя большую петлю над запросом, решаемым, переходя от query="name" к from="1" to="#name.recordcount#" index="row". Отказ Другой подход, который работает, использует <cfthread> Внутри петли как таковой:

<cfloop ...>
    <cfset threadName = "thread" & createUuid()>
    <cfthread name="#threadName#">
        <!--- do stuff --->
    </cfthread>
    <cfthread action="join" name="#threadName#">
</cfloop>

Это очень эффективно, когда вы работаете в ситуациях, когда вам нужно делать вещи внутри цикла, подобных запросам и <cfmodule> внутри <cffunction> Так что потребляемая память только для этой итерации.

Старый вопрос

Надеясь, что кто-то еще может подтвердить или сказать мне, что я делаю не так. Я могу постоянно воспроизвести OOM, запущенный, вызывая файл OOM.cfm (показано ниже). Использование JConsole, я могу увидеть запрос, потребляет память и никогда не выпускает его до завершения. Вопрос, по-видимому, звонит <cfmodule> Внутри <cffunction>, где, если я прокомментирую <cfmodule> Вызов вещей - сборщик мусора, пока запрос работает.

Версия ColdFusion: 9,0,1,274733

Аргументы JVM

java.home=C:/Program Files/Java/jdk1.6.0_18
java.args=-server  -Xms768m -Xmx768m -Dsun.io.useCanonCaches=false -XX:MaxPermSize=512m -XX:+UseParallelGC -Xbatch -Dcoldfusion.rootDir={application.home}/ -Djava.security.policy={application.home}/servers/41ep8/cfusion.ear/cfusion.war/WEB-INF/cfusion/lib/coldfusion.policy -Djava.security.auth.policy={application.home}/servers/41ep8/cfusion.ear/cfusion.war/WEB-INF/cfusion/lib/neo_jaas.policy -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=56033

Прецедент

oom.cfm. (это называет шаблон .CFM ниже - Adobe Bug # 85736)

<cffunction name="fun" output="false" access="public" returntype="any" hint="">
    <cfset var local = structNew()/>
    <!--- comment out cfmodule and no OOM --->
    <cfmodule template="template.cfm">
</cffunction>

<cfset size = 1000 * 200>
<cfloop from="1" to="#size#" index="idx">
    <cfset fun()>
    <cfif NOT idx mod 1000>
        <cflog file="se-err" text="#idx# of #size#">
    </cfif>
</cfloop>

template.cfm.

<!--- I am empty! --->

Обновление № 2. (CFTHREAD Case от Elliott Sprehn - Adobe Coldfusion Bug # 83359)

<cfthread name="test">  
  <cfloop from="1" to="10000" index="i">      
    <cflog text="This is very bad.">      
    <cflock name="test" timeout="10">      
    </cflock>  
  </cfloop>  
  <!--- Sleep a very long time (10 minutes) --->  
  <cfset sleep(600000)>
</cfthread>
Это было полезно?

Решение

Я не бегал в это раньше, но вот что я думаю, продолжается:

Каждый раз, когда вызывается CFModule, для него создается новое пространство памяти (который, IIRC, является основным отличием между ним и cfinclude). Поскольку вы называете CFModule в рамках функции, пространство памяти CFModule технически принадлежит пространству памяти этой функции. Память функции защищена от мусора, пока функция не будет выполнена. Результат: куча заполняет, и вы получаете ошибку OOM.

Я не думаю, что вызывает эту утечку памяти правильно, так как она ведет себя правильно, и когда функция завершается, сборщик мусора может очистить удержание в этой памяти. Тем не менее, я вижу, как это может быть неудобно.

Другие советы

Эта проблема проявляется с большим количеством тегов, к сожалению. Я видел это с cflock внутри cftread. Напишите очень длинную цикл беговой петли в CFTREAD, который использует CFLOCK, у вас в конечном итоге выберетесь. Это занимает много времени, но это происходит. Могу поспорить, что проблема удержания существует в регулярных запросах, но у вас обычно нет цикла, которая проходит сотни тысяч раз с Cflock внутри, поэтому никто не замечает.

Я уже давно сообщил об этой ошибке, но это никогда не было исправлено:http://www.elliottsprehn.com/cfbugs/bugs/83359.

Лучшее решение на данный момент - не использовать CFModule внутри петли, как это. Пользовательские теги действительно не предназначены для вызова 20K раз в одном запросе. Вы собираетесь захотеть использовать UDFS вместо этого. CFModule в любом случае очень дороги, и использование UDF будет заметно быстрее.

Вот обсуждение возможно, связанной с ColdFusion версии 9 CFC проблема утечки памяти: http://forums.Adobe.com/thhread/1034324?start=0&tstart=0.

Смотрите этот отчет об ошибке на этом: https://bugbase.adobe.com/index.cfm?event=bug&id=3124148.

Я не верю, что Adobe выпустил решение для вериона 9.01, но предположительно эта проблема фиксирована в версии 10. Есть обходные пути для большинства людей (в зависимости от объема их проблемы) для этого, не в отличие от того, что было описано здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top