2011-01-07 7 views
8

ルートが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! ---> 

更新#2cfthread 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> 
+0

私は、マルチスレッドが私の記憶を殺していた機会に遭遇し、ここにいくつか投稿しました。これが似ていたら私を驚かせることはないだろう。 –

+1

ループ内でcfmodule呼び出しを行い、関数を完全に省略するとどうなりますか? –

+0

@Adam Tuttle:良いコメント、そのようにテストしていない。リクエスト中にガベージコレクションが実行されたときには、それでも ' '内の' 'を指しています。 – orangepips

答えて

5

私は前にこれに実行されますが、ここで私が起こっていると思う何ていませんでした:

cfmoduleが呼び出されるたびに、新しいメモリ空間が作成されますh、IIRCは、それとcfincludeの主な違いです)。 関数内でcfmoduleを呼び出すため、cfmoduleメモリ空間は技術的にその関数のメモリ空間に属します。 関数のメモリは、関数が完了するまでガベージコレクションから保護されています。 結果:ヒープがいっぱいになり、OOMエラーが発生します。

正しく動作しているので、このメモリリークを正しく呼び出すとは思わないし、関数が完了すると、ガベージコレクタはそのメモリの保持をクリアすることができます。しかし、私はそれがどのように不便かもしれないかを見ることができます。

+1

+1これは私の疑惑なので+1。しかし、それはバグです。モジュール呼び出しがなければ、関数のメモリ割り当て*はリクエスト中にガーベジコレクションされます。その内部にcfmodule呼び出しを追加すると、関数が割り当てられたメモリの一部になり、関数が有効範​​囲外になる(たとえばループが反復する)ため、ガベージコレクションに使用できるはずですが、これは明らかに起こりません。真剣に、関数の内部にmodを持つ場合としない場合、あなた自身のためにテストケースを試してみてください。 – orangepips

+0

cfmoduleのメモリ空間は、名前付き変数には付けられていません。関数呼び出しが終了するまでスコープから外れません。デザインやバグが悪いですか?個人的には、それはちょうど悪いデザインだと思いますが、間違っている可能性があります。 –

+0

答えとしてマークしていますが、全体的にまだ苦いです(回答者の心ではありません)。 – orangepips

3

この問題は、残念なことに、多くのタグで現れます。私はcfthreadの中のcflockでこれを見てきました。cflockを使用するcfthreadに非常に長い実行ループを書くと、最終的にメモリ不足になります。それは長い時間がかかりますが、それは起こります。通常のリクエストにも保持の問題があると思いますが、通常は内部にcflockを入れて数十万回実行するループはありません。

私は長い時間前にこのバグを報告したが、それは固定やったことがなかった: http://www.elliottsprehn.com/cfbugs/bugs/83359

今の最善の解決策は、このようなループ内cfmoduleタグを使用しないことです。カスタムタグは、実際には1回のリクエストで20k回呼び出すためのものではありませんでした。代わりにUDFを使用したいと思うでしょう。とにかくcfmoduleは非常に高価で、UDFを使用すると目立って高速になります。ここで

+0

Sphrehn:+1元の質問にあなたの例を追加しました。呼び出しを何度も繰り返すという考えは悪いと言いましたが、cfmodule /をカスタムとして呼び出すことが期待されるコードがたくさんある8〜9歳のコードベースで作業することも問題ですタグ。 – orangepips

0

は、おそらく、関連の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で修正されています。問題の範囲に応じて、ここで説明した内容とは異なり、ほとんどの人には回避策があります。

+0

これはOPの質問に対するコメントです – Yaroslav

関連する問題