Googlersi, którzy mają zrzut sterty z korzeniami coldfusion.runtime.CFDummyComponent
czytają.Wyciek pamięci w pętli cfmodule wewnątrz cffunction
Aktualizacja 2/22/2011
Marc Esher of MXUnit fame found the exact same bug in a different context. Jego rozwiązanie obejmuje dużą pętlę nad zapytaniem rozwiązanym przez przejście z query="name"
do from="1" to="#name.recordcount#" index="row"
. Innym rozwiązaniem, które działa korzysta <cfthread>
wewnątrz pętli jako takie:
<cfloop ...>
<cfset threadName = "thread" & createUuid()>
<cfthread name="#threadName#">
<!--- do stuff --->
</cfthread>
<cfthread action="join" name="#threadName#">
</cfloop>
Jest to bardzo skuteczne, gdy napotkasz sytuacji, gdy trzeba robić rzeczy wewnątrz pętli jak zapytaniami i <cfmodule>
wewnątrz <cffunction>
tak, że pamięć zużywana jest tylko dla tej iteracji.
Old Pytanie
nadzieję, że ktoś inny może potwierdzić lub powiedz mi, co robię źle. Jestem w stanie konsekwentnie odtwarzać OOM, wywołując plik oom.cfm (pokazany poniżej). Używając jconsole, widzę, że żądanie zużywa pamięć i nigdy nie zwalnia jej aż do zakończenia. Wydaje się, że problem polega na wywołaniu <cfmodule>
wewnątrz <cffunction>
, gdzie w przypadku komentowania połączenia <cfmodule>
rzeczy są gromadzone podczas działania żądania.
ColdFusion wersja: 9,0,1,274733
JVM Argumenty
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
Przypadek Testowy
oom.cfm (wymaga to template.cfm poniżej - 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! --->
Aktualizacja # 2 (cfthread case from 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>
Znam przypadki, w których wielowątkowość zabijała moją pamięć, i wysłałem tu kilka na SO. Nie zdziwiłbym się, gdyby to było podobne. –
Co się stanie, jeśli wykonasz wywołanie cfmodule wewnątrz pętli, całkowicie pomijając funkcję? –
@Adam Tuttle: dobry komentarz, nie testowałem w ten sposób. Kiedy próbowałem odzyskać śmieci podczas żądania, tak nadal wskazuje na '' wewnątrz ''. –
orangepips