ora*_*ips 8 coldfusion memory-leaks coldfusion-9
Google员工,如果你有一个带有coldfusion.runtime.CFDummyComponent读取根的堆转储.
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>
Run Code Online (Sandbox Code Playgroud)
当您遇到需要在循环内部执行操作(如查询和<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
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
template.cfm
<!--- I am empty! --->
Run Code Online (Sandbox Code Playgroud)
更新#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>
Run Code Online (Sandbox Code Playgroud)
我之前没有碰到这个,但这就是我的想法:
每次调用cfmodule时,都会为它创建一个新的内存空间(IIRC,它与cfinclude之间的主要区别).因为您在函数内调用cfmodule,所以cfmodule内存空间在技术上属于该函数的内存空间.在函数完成之前,函数的内存不受垃圾回收的影响.结果:堆填充,并且您收到OOM错误.
我不认为调用这个内存泄漏是正确的,因为它的行为正确,并且当函数完成时,垃圾收集器可以清除该内存的保留.但是,我可以看到它可能不方便.
| 归档时间: |
|
| 查看次数: |
1663 次 |
| 最近记录: |