質問

ColdFusion でデータベース ロード スクリプトを作成しましたが、スクリプトが徐々にメモリ不足になるという問題が発生しています。<cfthread> を使用して各テーブルのロードを独自のスレッドに分割し、メモリが 50% を下回ったときにガベージ コレクタを呼び出しています (ガベージ コレクタがメモリを占有するのを防ぐために、gc() の呼び出しの間に 30 秒の間隔を空けるようにしています)。 。

スクリプトに必要なすべてのクエリを保持する CFC を作成しました。スクリプトは適切な CFC 関数を呼び出し、クエリを返します。クエリの一部のサイズは 2 MB を超えます。アクティブ スレッドの [メモリ] ページの詳細ビューでサーバー モニターを見ると、クエリ変数を varscope し、変数が最後にスコープ外になったにもかかわらず、CFC がクエリのコピーをメモリに保持しているように見えます。機能の。さらに、スレッドのメモリ内にクエリのコピーがあります。したがって、メモリ内にはクエリの 2 つのコピーのように見えるものが残ります。これは本当に何が起こっているのでしょうか?存在する場合、クエリの 1 つのコピーをメモリから削除するにはどうすればよいでしょうか?

役に立ちましたか?

解決

ここには潜在的な問題がたくさんありますが、考慮すべき最も重要な点のいくつかを強調したいと思います。

  1. なぜスレッドなのか?糸が必要ですか?おそらくあなたは、自分自身の利益のためにいじりすぎている特定の点があります。
  2. ガベージ コレクションを手動で強制することは、必ずしも良い考えではありません。ガベージ コレクションを自動的に実行するように JVM を調整しますが、やりすぎないようにしてください。ガベージ コレクションは高価になる傾向があり、頻繁に実行されすぎるとアプリのパフォーマンスに影響を与える可能性があります。
  3. CFC をどのようにインスタンス化していますか?クエリのリクエストごとに CFC をインスタンス化している場合、時間の経過とともに RAM の問題、つまり CFC が RAM にロードされる速度が速すぎてガベージ コレクションが追いつかないため、遅いメモリ リークが発生することになります。最善の策は、これをシングルトンにすることです。(つまり、アプリケーション スコープに設定します)。
  4. (私が理解している限りでは) 変数の var スコープでは、変数の使用が停止されるとすぐに自動的にメモリが解放されるわけではないことに注意してください。メモリはまだ予約されていますが、(おそらく?) より速くクリーンアップされるように、何らかの理由で短命世代の一部としてフラグが立てられている可能性があります。しかし、これは何も保証しません。
  5. アクティブなスレッドを見ている場合は、リクエストが終了するまでクエリがクリアされない可能性もあります。必ずしも関数呼び出しが終了する必要はありません。関数呼び出しが完了するとすぐにクエリが終了することを期待するのは、焦りのせいだと思われます。
  6. コールドフュージョン クエリは参照によって渡されます, 、価値によるものではありません。何らかの方法で、duplicate() または同様の関数を使用してクエリを明示的にコピーしない限り、メモリ内にクエリの 2 つのコピーを取得することは不可能です。

クエリは、cfreturn ステートメントからクエリへのポインタを返している可能性があります。そのクエリは、すべてのプロセスによる参照が完了するまでクリーンアップされません。したがって、クエリを他のプロセスに渡しても、そのクエリがメモリから消去されることはありません。たとえば、そのクエリをセッション変数に設定した場合、ガベージ コレクションを強制的に試みる頻度に関係なく、そのセッション変数がなくなるまでポインターはどこにも移動しません。

考慮すべき点がいくつかあります。

他のヒント

私は、各行が複数のCFCを含む広範な処理が必要となる大規模なデータ挿入処理と同様の問題を有していました。目のJDBC ResultSetが、ステートメントおよび接続の参照はリクエストの終了まで保持されます。によって作成されたことが表示されます。この手段はあなたのクエリ変数をゼロにしても、メモリ使用量に影響を与えていないこと。私はこれを暇な方法は、すべての行が処理されるまで、関数は次の100行などのために別のゲートウェイの呼び出しを行うことを、その後、プロセス100行へのCFC関数へのゲートウェイのコールを作ることでした。個々のゲートウェイのコールが実際に出ているので、それはすべてのそれのハンドルを解放し、そのメモリが回復します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top