Pregunta

de Google si tienes un volcado del montón con una raíz de coldfusion.runtime.CFDummyComponent leyendo.

Actualización 2/22/2011

Marc Esher de MXUnit la fama encontrado el mismo error exacto en un contexto diferente . Su solución implica un gran bucle sobre una consulta resuelto al pasar de query="name" a from="1" to="#name.recordcount#" index="row". Otro enfoque que se trabaja usando <cfthread> dentro del bucle, como tal,:

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

Esto es muy eficaz cuando se ejecuta en situaciones en las que hay que hacer las cosas dentro del bucle como consultas y <cfmodule> dentro <cffunction> para que la memoria consumida es sólo para esa iteración.

Antiguo pregunta

Con la esperanza de que alguien más puede confirmar o decirme lo que estoy haciendo mal. Soy capaz de reproducir consistentemente un OOM corriendo llamando a la oom.cfm archivo (que se muestra a continuación). Usando jconsole soy capaz de ver la memoria de solicitud consume y nunca lo suelte hasta que se complete. El problema parece estar llamando <cfmodule> interior de <cffunction>, en la que si comento hacia fuera del <cfmodule> cosas llamadas son basura recogida, mientras que la solicitud se está ejecutando.

versión de ColdFusion : 9,0,1,274733

Argumentos de 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

caso de prueba

oom.cfm (llamadas esta template.cfm abajo - 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! --->

Actualización # 2 ( cfthread caso de 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>
¿Fue útil?

Solución

No he encontrado esto antes, pero esto es lo que creo que está pasando:

Cada vez que se llama cfmodule, un nuevo espacio de memoria se crea para ella (que, IIRC, es la principal diferencia entre éste y cfinclude). Debido a que está llamando la cfmodule dentro de la función, el espacio de memoria cfmodule técnicamente pertenece al espacio de memoria de esa función. La memoria de la función está protegida contra la recolección de basura hasta que se haga la función. Resultado:. Rellenos montón, y se obtiene un error OOM

No creo llamando a esta fuga de una memoria es correcta, ya que se comporta de forma correcta, y cuando se complete la función, el recolector de basura puede borrar el control sobre esa memoria. Sin embargo, puedo ver cómo podría ser un inconveniente.

Otros consejos

Este problema se manifiesta con una gran cantidad de etiquetas por desgracia. He visto esto con cflock dentro cfthread. Escribir un ciclo muy largo que se ejecuta en un cfthread que los usos cflock, se le agota la memoria con el tiempo. Se tarda mucho tiempo, pero sucede. Apuesto existe el problema de la retención en las solicitudes regulares también, pero que no suelen tener un bucle que se ejecuta cientos de miles de veces con un interior cflock por lo que nadie se da cuenta.

Me informó este error hace mucho tiempo, pero nunca se fija: http://www.elliottsprehn.com/cfbugs/bugs/83359

La mejor solución por ahora es no utilizar cfmodule dentro de un bucle como este. Las etiquetas personalizadas en realidad no estaban destinados para llamar 20k veces en una sola solicitud. Vas a querer utilizar las UDF en su lugar. cfmodule es de todos modos muy caro y utilizando una UDF será mucho más rápido.

Esta es una discusión de una versión ColdFusion 9 CFC problema de pérdida de memoria posiblemente relacionadas: http://forums.adobe.com/thread/1034324?start=0&tstart=0

Ver este informe de error es el siguiente: https://bugbase.adobe.com /index.cfm?event=bug&id=3124148

No creo Adobe lanzó una solución para verion 9.01 pero se supone que se solucione este problema en la versión 10. Hay soluciones para la mayoría de las personas (dependiendo del alcance de su problema) de este no muy diferente de lo que se ha descrito aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top