2

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

index.cfm:

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

test.cfc:

<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>

そして、ここにエラーメッセージがあります:

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

どんな助けでもいただければ幸いです。

4

3 に答える 3

3

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

そのため、コンポーネントが持つプロパティの数に応じて、ヒープエラーが発生するまで作成できるプロパティの数が決まります。

私はこれがあなたの問題を助けないことを知っています、しかし少なくとも今あなたはそれを防ぐための対策をとることができます。

于 2009-04-27T12:48:37.817 に答える
2

rio747は正しいです。要求が終了するまでメモリは解放されないため、メモリが不足しているだけです。私はあなたがおそらくそれを実行してエラーを取得し、0を削除すると実行できると思い切って言います。Javaガベージコレクションは実行されていますが、リクエストが終了するまで実行されません。

解決のための唯一のオプションは、1回のリクエストで多くのオブジェクトを作成しないか(おそらくこれが必要な理由についての詳細情報がありますか?)、ColdFusionで使用できるメモリの量を増やすことです。

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

于 2009-04-27T15:31:34.900 に答える
0

メモリが特定のしきい値を下回った場合にプログラムによるガベージコレクションを実行する方法を示す新しいブログエントリを投稿しました。お役に立てば幸いです。-

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

于 2009-06-25T14:05:18.873 に答える