ルートがcoldfusion.runtime.CFDummyComponent
であるヒープダンプがある場合は、Googleリーダーにお読みください。メモリリークcffunction内でcfmoduleをループする
アップデート2011年2月22日
Marc Esher of MXUnit fame found the exact same bug in a different context。彼の解決策は、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>
あなたが消費するメモリがあるように<cffunction>
内部クエリと<cfmodule>
のようなループ内のことを行う必要がある状況に遭遇したときにこれは非常に有効ですその反復のためだけに。他の誰かが確認したり、私が間違ってやっているものを私に伝えることができます願って
旧質問
。私は、oom.cfmファイル(下記参照)を呼び出して、実行中のOOMを一貫して再現することができます。 jconsoleを使用すると、要求がメモリを消費し、完了するまで解放されることはありません。問題は、を<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>
template.cfm
<!--- I am empty! --->
更新#2(cfthread case from 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>
私は、マルチスレッドが私の記憶を殺していた機会に遭遇し、ここにいくつか投稿しました。これが似ていたら私を驚かせることはないだろう。 –
ループ内でcfmodule呼び出しを行い、関数を完全に省略するとどうなりますか? –
@Adam Tuttle:良いコメント、そのようにテストしていない。リクエスト中にガベージコレクションが実行されたときには、それでも ' '内の' 'を指しています。 –
orangepips