私はおそらくここで少し編集していますが、仮想/論理メモリを使用する現代の傾向 (両方の名前が使用されていますが、「論理」の方がより明確です) は、メモリがいつ使い果たされたかを知ることを劇的に複雑にします。 Linux の古い実際の (RAM + スワップ) モデル (これを物理モデルと呼びます) は、次のようになります/etc/sysctl.d/10-no-overcommit.conf
。
vm.overcommit_memory = 2
vm.overcommit_ratio = 100
malloc
これにより、プログラムが単に失敗した場合、そのプログラムがメモリ不足の実際の原因である可能性が高く、現在のオブジェクトの構築から離れfree
て途中でメモリを使用できるという哲学を持つ能力が回復します。あまりにも多くの RAM を必要とするクレイジーなものを要求し、次の要求を待っていることに対してユーザーに不平を言う可能性があります。このモデルでは、ほとんどの OOM 条件はほぼ瞬時に解決されます。プログラムは対処しておそらく RAM を返すか、次の SEGV によって返された 0 を使用しようとするとすぐに強制終了されmalloc
ます。
2013年にLinuxがデフォルトで使用する傾向がある仮想/論理メモリモデルでは、これは機能しません。これは、プログラムがメモリを見つけられないためですmalloc
. RAMのどこにもないことに気づきます。ホストの RAM を使い果たしたプログラムではなく、システム上のすべてのプログラムが停止する可能性があるため、これは大惨事になります。一部の GLib 関係者がこの問題を修正しようとさえ気にかけない理由は理解できます。なぜなら、論理メモリ モデルでは修正できないからです。
論理メモリの本来の目的は、ホストのメモリの半分以上を使用する巨大なプログラムがサポート プログラムをフォークして実行できるようにすることでした。通常、その特定の使用パターンを持つホストでのみ有効にされていました。2013 年にホーム ワークステーションが 24 GiB 以上の RAM を搭載できるようになった現在、99% の確率で論理メモリを有効にする言い訳はありません。起動時に RAM が 4 GiB を超えるホストでは、おそらくデフォルトで無効にする必要があります。
ともかく。古い学校の物理モデルのアプローチを採用したい場合は、コンピューターでそれが有効になっていることを確認してください。そうしないと、malloc
とのrealloc
呼び出しをテストしても意味がありません。
あなたがそのモデルにいるなら、GLib は実際には同じ哲学に導かれていないことを思い出してください ( http://code.google.com/p/chromium/issues/detail?id=51286#c27を参照してください。それらのうちです)。GLib に基づくすべてのライブラリも同様に感染する可能性があります。ただし、物理メモリ モデルで GLib を使用すると、独自のメモリ ハンドラを で置き換えることによって、興味深いことができるg_mem_set_vtable()
可能性があります。これは、プログラム グローバルをいじり、キャッシュなどの使用量を減らしてスペースを解放できる可能性があるためです。 、次に基になる を再試行しmalloc
ます。ただし、特別なハンドラーが呼び出された時点でどのオブジェクトが構築中であったかがわからないため、それ自体が制限されます。