1

過去数年間、ColdFusionでスケジュールされたタスクを実行すると、出力ログに次のメッセージがランダムに表示されます。

再帰が深すぎます。スタックがオーバーフローしました。

呼び出されているタスク内のコードはさまざまですが、この場合、データベースのカウンターをリセットし、成功したことを通知するメールを送信するだけの非常に単純なコードです。しかし、私はそれがあらゆる種類のコードで起こるのを見てきました、それで私はそれがこの問題を引き起こしているコードではないと確信しています。

呼び出されている他のコードをブロックするための空のapplication.cfm/cfcもあります。

これが表示されるのは、CFを再起動し、サービスが完全に開始される前にページを表示しようとしているときだけです。

エラーが発生することはめったにありませんが、実行されない場合に問題を引き起こすかなり重要なスケジュールされたタスクがいくつかあります。(したがって、私は助けのためにここに投稿しています)

メモリ使用量は問題ありません。直前に実行されたタスクは、80%を超える空きメモリを報告しました。夜間にメモリを監視しても、異常なスパイクは表示されません。マシンには4ギガのメモリがあり、OSとCF以外は何も実行されていません。最近、問題を解決するためにCFを再インストールしようとしましたが、役に立ちませんでした。他のいくつかのサーバーでも発生します。

これは内部サーバーであるため、午前3時の使用は存在しないはずです。その時点で実行されている他のスケジュールされたタスクはありません。

これは、CF7、CF8、およびCF9ボックス(完全にパッチが適用されている)で確認されています。

問題の現在のボックス情報:

  • CFバージョン:9,0,1,274733
  • エディション:エンタープライズ
  • OS:Windows 2003 Server
  • Javaバージョン:1.6.0_17
  • 最小JVMヒープ:1024
  • 最大JVMヒープ:1024
  • 最小パーマサイズ:64m
  • 最大パーマサイズ:384m
  • サーバーメモリ:4GB
  • CPU使用率が5%を超えることはめったにないクアッドコアマシン

JVM設定:

-server -Dsun.io.useCanonCaches = false -XX:PermSize = 64m -XX:MaxPermSize = 384m -XX:+ UseParallelGC -XX:+ AggressiveHeap -Dcoldfusion.rootDir = {application.home} /../ -Dcoldfusion.libPath = {application.home} /../lib -Doracle.jdbc.V8Compatible = true

これは、昨夜実行できなかったが、何年も実行されており、明日実行される可能性が最も高い、信じられないほど複雑なコードです。

<cfquery datasource="common_app">
    update  import_counters
    set current_count = 0
</cfquery>

<cfmail subject="Counters reset" to="my@email.com" from="my@email.com"></cfmail>

私が何かを逃した場合は私に知らせてください。 ありがとうございました!

4

3 に答える 3

1

サーバーがColdFusion9にアップグレードされた後、しばらくの間この問題が発生しました。修正は、jRun 4に関するAdobeのこのテクニカルノートにあるようです。http://kb2.adobe.com/cps/950/950218dc.html

テクニカルノートに記載されているように、おそらく権限を調整する必要があります。

于 2010-09-03T15:45:28.863 に答える
0

試すことができるのは、CF管理者で最小JVMヒープサイズを最大JVMヒープサイズ(MB)と同じに設定することです。

また、JVMを最新(21)または少なくとも20に更新します。

これまでは、何か奇妙なことが起こり始めたときはいつでも、JVMをアップグレードしてきました。これは、通常、問題を解決するためです。

于 2010-09-03T17:14:12.993 に答える
0

ヒープのサイズを1024から800に減らしてみましたか。使用可能なメモリの80%以上が残っているとのことなので、可能であれば、最大数を減らすことを検討します。

32ビットまたは64ビットのOSですか?ヒープスペースを割り当てるときは、プロセスのOS制限を超えないように、JVMのすべてのオーバーヘッド(スタック、ライブラリなど)を考慮する必要があります。

于 2010-09-03T17:21:15.317 に答える