Googlers, если у вас есть дамп кучи с корнем coldfusion.runtime.CFDummyComponent
, читайте дальше.
Обновление 2/22/2011
Марк Эшер из 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 (это вызывает template.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 ( футляр от Elliott Sprehn - Adobe ColdFusion Ошибка # 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>