谷歌员工,如果你有一个带有coldfusion.runtime.CFDummyComponent
读取根的堆转储。
2011 年 2 月 22 日更新
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 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>
模板.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>