内存泄漏循环cfModule在cffunction内部
-
08-10-2019 - |
题
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中解决的。大多数人(根据他们的问题的范围)有解决方法,因为这与此处所描述的不同。