質問

あなたは何をしますか malloc 0または新しいスローの例外を返しますか? OOM状態に耐えたり、ユーザーの作業を節約したりするだけですか?

役に立ちましたか?

解決

クラッシュを避けるようにOOMを避けます。

一度に膨大な仕事をして(そして膨大な記憶を割り当てる)ことを避けてください。ディスク上のデータを保持し、OSディスクキャッシュを信頼し、メモリマップされたIOを可能な限り使用し、一度にデータのごく一部のみで動作します。大量のデータをオンラインで(遅延が低い)オンラインである必要がある場合は、すべての大規模な検索エンジン企業が行うように、いくつかのマシンのメモリに保管してください。またはSSDを購入します。

他のヒント

この質問に答えるほとんどの人は、おそらくMallocを0に戻すことが非常に現実的な可能性である埋め込みシステムに取り組んだことはありません。私が現在取り組んでいるシステムでは、合計4.25KバイトのRAM(4352バイト)があります。スタックに64バイトを割り当てていますが、現在1600バイトのヒープがあります。ちょうど昨日、私はヒープウォークルーチンをデバッグしていたので、記憶の割り当てと解放に従うことができました。ヒープウォークは、小さな(30バイト)静的に割り当てられたバッファーを使用して、シリアルポートに出力します。リリースバージョンではオフになります。

これは消費者製品であるため、製品がリリースされてもメモリがなくなってはいけません。開発中は確信しています。いずれにせよ、私にできることは、スピーカーを数回ビープ音を鳴らし、再起動を強制することです。

正直に言うと、私が行ったすべてのプロジェクトにおいて(私はまだどこにも働いていないことを念頭に置いてください)、私はそれが起こる可能性があるとは考えていなかったので、私のプログラムは非常に速い死で死ぬと思います。

その上、OOMを処理するには、エラーメッセージを表示したり、すべてを保存するためにリソースをPreallocatedしている必要があります。

最近は、記憶がピーナッツよりもコストがかからない、それは頻繁に起こるべきであることではないと感じています。保護されたメモリの夜明けと以前には、多分それは懸念だったかもしれませんが、今は?私が今まで見た唯一のOOMエラーは、Bugged Codeからでした。

とにかく、mallocリターンコードをチェックすることは無意味です。

最新のオペレーティングシステムはメモリを過剰にコミットします。これらは、実際に利用可能なものよりも多くのメモリをプロセスに与えます。プロセスが許可されているメモリは仮想で、すべてが1つのゼロアウトページにマッピングされます。

物理的でユニークなページがプロセスに割り当てられていることは、記憶に書くまでです。この割り当てが失敗した場合、カーネルはメモリを見つけるためにプロセス(おそらくあなたのもの!)を終了します。その時点で、これ以上できることは何もありません。

組み込みシステム、リアルタイムシステム、または非常に重要なシステムのために開発を開発している場合を除き、障害が寿命や数十億ドルの費用がかかる可能性がある場合は、おそらく、記憶の条件を心配することは経済的に価値がないでしょう。

ほとんどの場合、新しいオブジェクトを作成したり、何かを行う可能性のあるタスクを実行するメモリがないため、とにかくメモリから外れているときにできることはほとんどありません。 OOMを処理するアプリのコストと、それを行うことから得られる利点を比較検討する必要があります。

私はいつもエラーをチェックします。何かがエラー条件を返している場合、プログラムで処理する必要があります。 「記憶から外れて、行かなければならない!」というメッセージであっても、「アクセス違反」、「コアダンプ」などよりも優れています。 1つは、処理するエラー条件、もう1つはバグです。そして、ユーザーはそれを同様に認識します。

特定のケースでは、操作をロールバックし、障害のポイントに到達するまで割り当てたリソースを解放し、エラーを報告し、実行を継続することができます(アプリケーションを終了しようとしている場合、すぐに終了するオプション)。これにより、ユーザーは何をすべきかを決定したり、ファイルをいじりたり、ファイルを閉じたりすることでメモリを解放しようとすることができます。もちろん、状況を処理する方法はプログラムに大きく依存しています - インタラクティブになると、おそらくエラーを記録して終了するか、続行する必要があります。

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