Googleers如果您有一个根源 coldfusion.runtime.CFDummyComponent 阅读。

更新2/22/2011

Mxunit名望的Marc Esher在不同的上下文中发现了完全相同的错误. 。他的解决方案涉及通过从 query="name"from="1" to="#name.recordcount#" index="row". 。有效的另一种方法是使用 <cfthread> 在循环内部的内部:

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

当您遇到需要在循环中进行诸如查询和 <cfmodule> 里面 <cffunction> 因此,消耗的内存仅用于迭代。

旧问题

希望别人可以确认或告诉我我做错了什么。我能够通过调用文件oom.cfm(如下所示)来始终如一地重现运行的OOM。使用jconsole,我可以看到该请求会消耗内存,并且永远不会释放它,直到完成。这个问题似乎在打电话 <cfmodule> 代替 <cffunction>, ,如果我在哪里发表评论 <cfmodule> 请求在请求运行时收集垃圾。

ColdFusion版本: 9,0,1,274733

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

测试用例

oom.cfm (这是在下面调用template.cfm - Adobe错误#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! --->

更新#2 (Elliott Sprehn的CFThread案件 - 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>
有帮助吗?

解决方案

我以前从未遇到过,但这是我认为正在发生的事情:

每次调用CFMODULE时,都会为其创建一个新的内存空间(IIRC是IT和Cfinclude之间的主要区别)。由于您在函数中调用CFMODULE,因此CFMODULE内存空间从技术上属于该函数的内存空间。该函数的内存受到保护免受垃圾收集的保护,直到完成功能为止。结果:堆填充,您会遇到OOM错误。

我认为将其称为内存泄漏是正确的,因为它的行为正确,并且当功能完成时,垃圾收集器可以清除该内存的固定。但是,我可以看到它可能不便。

其他提示

不幸的是,这个问题以许多标签表现出来。我已经在CFTHREAD内看到了Cflock。在使用cflock的CFThread中写一个很长的运行循环,最终您将用完内存。这需要很长时间,但是发生了。我敢打赌,保留问题也存在定期要求,但是您通常不会有数十万次的循环,内部有一个cflock,所以没有人注意到。

我很久以前就报告了这个错误,但是它从未解决:http://www.elliottsprehn.com/cfbugs/bugs/83359

目前最好的解决方案是不要在这样的环内使用CFMODULE。自定义标签确实不打算在单个请求中调用20k次。您将要使用UDFS。无论如何,CFMODULE非常昂贵,并且使用UDF的速度明显更快。

这是对可能相关的ColdFusion版本9 CFC内存泄漏问题的讨论: http://forums.adobe.com/thread/1034324?start=0&tstart=0

请参阅此错误报告: https://bugbase.adobe.com/index.cfm?event=bug&id=3124148

我不认为Adobe发布了关于Verion 9.01的修复程序,但据说这个问题是在版本10中解决的。大多数人(根据他们的问题的范围)有解决方法,因为这与此处所描述的不同。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top