2009-04-27 23 views
2

ColdFusionのヒープに問題があります。ここで私が実験している小さなサンプルアプリケーションです。私はcfinvokeの後に、initメソッドを呼び出すと、コンポーネントのすべての変数を破壊すると考えました。しかし、明らかにそうではありません。アプリケーションは以下のように動作しますが、ループにゼロを追加すると、index.cfmが破損します。それを引き起こすためにヒープには何が格納されていますか?これを回避する方法はありますか?CFINVOKEとColdFusionのjava.lang.OutOfMemoryError

index.cfmに:

<cfloop from="1" to="1000" index="i"> 
    <cfinvoke component="test" method="init" returnvariable="x"> 
</cfloop> 
<cfoutput><p>#x#</p></cfoutput> 

test.cfc:

SEVERE: Servlet.service() for servlet CfmServlet threw exception 
javax.servlet.ServletException: ROOT CAUSE: 
java.lang.OutOfMemoryError: Java heap space` 

任意の助けになります。

<cfcomponent output="false"> 
    <cffunction name="init" returntype="string"> 
     <cfset var test = structNew()> 
     <cfloop from="1" to="1000" index="i"> 
      <cfset test[i] = i> 
     </cfloop> 
     <cfreturn Now()> 
    </cffunction> 
</cfcomponent> 

そして、ここでは、エラーメッセージがあります感謝する。

+0

あなたはどのバージョンを追加する必要がありますあなたが実行しているColdFusionの将来的な関連情報です。 –

答えて

3

これは既知の問題であり、現在のところ回避方法はありません。 CFはガベージコレクションを適切に処理しないようです。私が知る限り、要求が完了するまで、コンポーネントによって使用されたメモリを破壊して解放しません。

これにより、コンポーネントのプロパティの数によって、ヒープエラーが発生するまで作成できるプロパティの数が決まります。

これはあなたの問題を助けるものではないことは分かっていますが、少なくとも今、あなたはそれを防ぐ手段を講じることができます。

+0

これはかなり古い質問だと思いますが、2009年にこの既知の問題についてあなたのソースを挙げることができますか? –

+0

http://rip747.wordpress.com/2008/09/29/help-force-coldfusion-to-release-memory/ – rip747

+0

これはガベージコレクションを強制する方法を尋ねる人へのリンクです。バグですが、しばしばそうであるように、根本的な原因は悪いコードと非常によく関連しています。これはAdobeによって識別/解決されましたか? –

2

rio747が正しい場合は、要求が終了するまでメモリが解放されないため、メモリが不足しているだけです。私はあなたがおそらくそれを実行し、エラーを取得し、0を取り除くことができると言うことを念頭に置いています。 Javaガベージコレクションは実行中ですが、要求が終了するまでは実行されません。

解決策の選択肢は、1回のリクエストで何個のオブジェクトを作成しないか(なぜこれが必要なのかについての詳細情報)、またはcoldfusionで使用できるメモリの量を増やすことです。

これは本当にガーベジコレクションを正しく処理できない問題またはCFではないと思います。その要求がアクティブである限り、Javaの観点から見れば、オブジェクトは引き続き使用され、参照される可能性があります。つまり、あなたはcfinvokeとその動作について正しいですが、それはjvmが要求が終了するまでそれらのメモリ位置で実際にガベージコレクションを実行できるということではありません。

0

私はちょうど...それがお役に立てば幸いあなたのメモリが一定のしきい値を下回る取得する場合は、プログラムガベージコレクションを行うことができます方法を示して新しいブログエントリを掲載している: -

[http://www.beetrootstreet.com/blog/index.cfm/2009/6/25/Clearing-ColdFusion-memory-using-garbage-collection-when-memory-gets-low][1]

+0

あなたのポストはガベージコレクタを強制的に強制しますが、要求終了後までガベージコレクションのフラグが立てられないので、多くのオブジェクトを作成するときにヒープの問題に役立ちません。 – rip747

関連する問題