Googlers, wenn Sie einen Heap-Dump mit einer Wurzel von coldfusion.runtime.CFDummyComponent
haben, lesen Sie weiter.Memory Leak Looping cfmodule innerhalb cffunction
aktualisieren 2/22/2011
Marc Esher of MXUnit fame found the exact same bug in a different context. Seine Lösung beinhaltet eine große Schleife über eine Abfrage, die gelöst wird, indem von query="name"
zu from="1" to="#name.recordcount#" index="row"
gewechselt wird. Ein weiterer Ansatz, der unter Verwendung von <cfthread>
innerhalb der Schleife als solche funktioniert:
<cfloop ...>
<cfset threadName = "thread" & createUuid()>
<cfthread name="#threadName#">
<!--- do stuff --->
</cfthread>
<cfthread action="join" name="#threadName#">
</cfloop>
Dies ist sehr effektiv, wenn Sie Situationen führen, in denen man die Dinge in der Schleife wie Abfragen und <cfmodule>
innerhalb <cffunction>
tun müssen, so dass die verbrauchte Speicher nur für diese Iteration.
Alt Question
der Hoffnung, jemand anderes kann mir bestätigen oder sagen, was ich falsch mache. Ich bin in der Lage, eine laufende OOM konsistent zu reproduzieren, indem ich die Datei oom.cfm aufruft (siehe unten). Mit jconsole kann ich sehen, dass die Anfrage Speicher verbraucht und sie nie wieder freigibt, bis sie abgeschlossen ist. Das Problem scheint <cfmodule>
innerhalb von <cffunction>
zu rufen, wo, wenn ich den <cfmodule>
Aufruf auszeichne, werden Sachen Müll gesammelt, während die Anforderung ausgeführt wird.
Coldfusion-Version: 9,0,1,274733
JVM Argumente
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
Test Case
oom.cfm (dies nennt template.cfm unten - 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! --->
Update # 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>
Ich bin auf Gelegenheiten gestoßen, bei denen Multithreading mein Gedächtnis verlor, und schrieb ein paar hier auf SO. Würde mich nicht überraschen, wenn das ähnlich wäre. –
Was passiert, wenn Sie nur den cfmodule-Aufruf innerhalb der Schleife ausführen und die Funktion vollständig auslassen? –
@Adam Tuttle: guter Kommentar, hatte nicht so getestet. Wenn ich versucht, Speicherabfrage während der Anfrage auftritt, so zeigt noch immer auf '' innerhalb ''. –
orangepips