Frage

Googler, wenn Sie einen Heapdump mit einer Wurzel coldfusion.runtime.CFDummyComponent haben lesen Sie weiter.

Update 2011.02.22

Marc Esher von MXUnit Ruhm der exakt gleichen Fehler in einem anderen Kontext . Seine Lösung beinhaltet eine große Schleife über eine Abfrage gelöst, indem von query="name" zu from="1" to="#name.recordcount#" index="row" gehen. Ein anderer Ansatz, der in der Schleife als solche verwendet <cfthread> 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 Sie brauchen, um Dinge innerhalb der Schleife wie Abfragen und <cfmodule> innerhalb <cffunction> zu tun, damit die verbrauchte Speicher nur für diese Iteration ist.

Alt Question

Hoffnung, jemand anderes kann bestätigen, oder mir sagen, was ich falsch mache. Ich bin in der Lage, konsequent eine OOM zu reproduzieren ausgeführt, indem die Datei oom.cfm Aufruf (siehe unten). Mit jconsole Ich kann den Wunsch verbraucht Speicher sehen und nie gibt sie bis zur vollständigen. Die Ausgabe erscheint <cfmodule> innerhalb von <cffunction> zu rufen, wo, wenn ich die <cfmodule> Anruf Dinge sind Müll gesammelt kommentieren, 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 (diese Anrufe 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 Fall von 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>
War es hilfreich?

Lösung

Ich habe, bevor sie in das nicht laufen, aber hier ist das, was ich denke, geht auf:

Jedes Mal, cfmodule genannt wird, ein neuer Speicherplatz für sie geschaffen (die IIRC, ist der Hauptunterschied zwischen ihm und cfinclude). Da Sie die cfmodule innerhalb der Funktion aufrufen, die cfmodule Speicherplatz gehört technisch zu der Speicherplatz der Funktion. Die Speicher der Funktion wird von der Garbage Collection geschützt, bis die Funktion ausgeführt wird. Ergebnis:. Heap füllt, und Sie ein OOM-Fehler erhalten

Ich glaube nicht, das ein Speicherleck Aufruf korrekt ist, wie es richtig verhält, und wenn die Funktion beendet ist, kann die Garbage Collector den Halt an diesem Speicher löschen. Allerdings kann ich sehen, wie es unbequem sein könnte.

Andere Tipps

Dieses Problem manifestiert sich mit vielen Tags leider. Ich habe diese cfthread mit cflock innen gesehen. Schreiben Sie eine sehr lange Laufschleife in einem cfthread dass Anwendungen cflock, werden Sie laufen schließlich aus Speicher heraus. Es dauert eine lange Zeit, aber es passiert. Ich wette, das Retentions Problem zu in regelmäßigen Anfragen vorhanden ist, aber Sie haben nicht in der Regel eine Schleife, die Läufe Hunderttausende Male mit einem cflock innen, so dass niemand bemerkt.

Ich berichten diesen Fehler vor langer Zeit, aber es wurde nie festgelegt: http://www.elliottsprehn.com/cfbugs/bugs/83359

Die beste Lösung für jetzt ist nicht Gebrauch cfmodule in einer Schleife wie diese. Custom Tags wirklich wurden für den Aufruf 20k mal in einer einzigen Anfrage nicht vorgesehen. Du wirst UDF wollen, anstatt verwenden. cfmodule ist extrem teuer sowieso und ein UDF verwendet, wird deutlich schneller sein.

Hier ist eine Diskussion über ein möglicherweise mit Coldfusion-Version 9 cfc Speicherleck Problem: http://forums.adobe.com/thread/1034324?start=0&tstart=0

Sehen Sie diesen Fehlerbericht darauf: https://bugbase.adobe.com /index.cfm?event=bug&id=3124148

Ich glaube nicht, dass Adobe ein Update für verion 9.01 freigegeben, aber angeblich dieses Problem in Version fixiert ist 10. Es gibt Workarounds für die meisten Menschen (je nach Umfang ihres Problems) für diese nicht unähnlich, was hier beschrieben worden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top