これは本当に醜い質問です。フォークでメモリリークを緩和する
私はループの中で、次のないC++プログラムがあります。
- 待機JMSメッセージ
- については、応答 に
私をJMSメッセージを送信します
このメモリリークにより、ループの "いくつかのデータを計算する"フェーズでBobがクラッシュします。これは問題です。なぜなら、別のプログラムがBobの応答を待っていて、受信しなければ非常に怒ってしまうからです。
さまざまな制限(X/Y問題です)のため、唯一実行可能な戦略は、ループ内で次のことを行うようにBobを変更することです:
JMSメッセージ- ウェイツが、それは場合は、「あまりにも多くの」メモリ
- を使用しての危険にさらされますかどうかに応じて
- 小切手を
- は、JMSメッセージを送信し、いくつかのデータを計算しますので、フォークとエグゼクティブNotherの自身のコピー、そして優雅に
を終了し、次のように私の質問は次のとおりです。
たちは「あまり」のメモリを使用しているかどうかを検出するための最良の(信頼性ではなく、あまりにも非効率的な)方法は何ですか?私の現在の考えは、getrlimit(RLIMIT_AS) rlim_cur
をgetrusage(RUSAGE_SELF) ru_maxrss
と比較することです。あれは正しいですか?そうでない場合、より良い方法は何ですか? Bobはさまざまなホストマシン上のLinux VM内で実行されます。すべてのメモリ量は異なります。
"Calculates some data"フェーズでメモリリークが発生したと仮定して、別のプログラムにその部分をリファクタリングし、別のメモリ空間で実行するためにフォークアウトする方が理にかなっていますか?そうすれば、メモリ不足時にプログラムを再起動させるだけで問題を隠すのではなく、問題のコードを分離して、将来置き換えることが容易になります。それは単なる考えです。コードを見ることなく、それがあなたのために実行可能な選択肢であるかどうかは言えません。回避策として –
。なぜ計算が終わるたびに終了せずに毎回プログラムを再起動するのですか? –
ジーン、実行可能な極端に。厳密に必要なときに再起動するだけで、オーバーヘッドを減らすことが可能かどうか疑問に思っています。 – Arandur