Question

Googlers si vous avez une décharge de tas avec une racine de coldfusion.runtime.CFDummyComponent lire.

Mise à jour 2/22/2011

Marc Esher de la renommée MXUnit trouvé le même bug exact dans un contexte différent. Sa solution implique une grande boucle sur une requête résolu en allant de query="name" à from="1" to="#name.recordcount#" index="row". Une autre approche qui fonctionne utilise <cfthread> dans la boucle en tant que tel:

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

Ceci est très efficace lorsque vous exécutez dans des situations où vous avez besoin de faire des choses dans la boucle comme les requêtes et <cfmodule> à l'intérieur <cffunction> afin que la mémoire consommée est seulement pour cette itération.

Old Question

En espérant que quelqu'un d'autre peut-il confirmer ou me dire ce que je fais mal. Je suis en mesure de reproduire systématiquement un OOM en cours d'exécution en appelant le fichier oom.cfm (ci-dessous). En utilisant jconsole Je suis en mesure de voir la demande et consomme de la mémoire ne le libère jusqu'à la fin. La question semble appeler <cfmodule> l'intérieur de <cffunction>, où si je commente la choses d'appel <cfmodule> sont des ordures collectées pendant que la demande est en cours d'exécution.

Version ColdFusion : 9,0,1,274733

Arguments 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

Test Case

oom.cfm (ce qui appelle template.cfm ci-dessous - 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! --->

Mise à jour # 2 ( cfthread cas 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>
Était-ce utile?

La solution

Je n'ai pas rencontré ce avant, mais voici ce que je pense qui se passe:

Chaque CFMODULE de temps est appelé, un nouvel espace de mémoire est créé pour (ce qui, IIRC, est la principale différence entre elle et cfinclude). Parce que vous appelez la CFMODULE dans la fonction, l'espace mémoire CFMODULE appartient techniquement à l'espace mémoire de cette fonction. La mémoire de la fonction est protégée de la collecte des ordures jusqu'à ce que la fonction se fait. Résultat:. Remplissages tas, et vous obtenez une erreur OOM

Je ne pense pas appeler cette une fuite de mémoire est correcte, car il se comporte correctement, et lorsque la fonction finalise, le garbage collector peut effacer l'emprise sur cette mémoire. Cependant, je peux voir comment cela pourrait être gênant.

Autres conseils

Ce problème se manifeste avec de nombreuses balises malheureusement. Je l'ai vu avec cflock intérieur cfthread. Ecrire une boucle très longue course dans un cfthread que les utilisations cflock, vous serez à court de mémoire par la suite. Il prend beaucoup de temps, mais cela arrive. Je parie que le problème de rétention existe dans les demandes régulières aussi, mais vous n'avez pas habituellement une boucle qui passe des centaines de milliers de fois avec l'intérieur CFLOCK afin que personne ne remarque.

Je l'ai signalé bug il y a longtemps, mais il n'a jamais été réparé: http://www.elliottsprehn.com/cfbugs/bugs/83359

La meilleure solution pour est maintenant de ne pas utiliser CFMODULE dans une boucle comme celui-ci. Les balises personnalisées ne sont pas vraiment destinés à appeler 20k fois dans une seule requête. Vous allez vouloir utiliser des FDU à la place. CFMODULE est de toute façon extrêmement coûteux et en utilisant une UDF sera nettement plus rapide.

Voici une discussion d'une version Coldfusion liée peut-être 9 cfc problème de fuite de mémoire: http://forums.adobe.com/thread/1034324?start=0&tstart=0

Voir ce rapport de bogue sur elle: https://bugbase.adobe.com /index.cfm?event=bug&id=3124148

Je ne crois pas Adobe a publié un correctif pour verion 9.01 mais soi-disant ce problème est résolu dans la version 10. Il existe des solutions de contournement pour la plupart des gens (selon la portée de leur problème) pour ce pas contrairement à ce qui a été décrit ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top