問題タブ [enomem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1339 参照

c++ - ::popen() からの ENOMEM の原因

私はほとんど動作するアプリケーションを持っていますが、::popen() の呼び出しでエラーが発生し、errno が ENOMEM に設定されているという状況が 1 つあります。::popen() の man ページでは、::fork() のページを参照してください。このページには、Linux に関する次の短いコメントが付いた ENOMEM がリストされています。

本当にメモリが不足しているのか、それともファイル記述子のような他のリソースが不足しているのか疑問に思っています。fork() は、システムの実際のメモリ不足以外の理由で ENOMEM を与えることができますか? Centos4です。

0 投票する
0 に答える
3142 参照

winapi - malloc は NULL を返し、errno を ENOMEM に設定しますが、使用可能なヒープ領域は十分にありますか?

malloc()に戻りNULL、設定errnoする状況がありますENOMEM。ただし、CRT ヒープ (拡張可能) には、使用できる十分なメモリがあります。の時点でmalloc、私のプロセス メモリは約 900 MB です。ホスト プロセスは、Sun HotSpot JVM の下で実行される Java 実行可能ファイルです。

malloc()私がやっているのは80メガバイトで、失敗します。60 MB の割り当てを行うと、成功します。その後、50 MB の割り当てに続いて別の割り当てが行われ、別の割り当ても成功します。明らかに、まだ多くのメモリが残っていますが、80 MB の malloc は OS が消化するには大きすぎるようです。

4 GB RAM の Windows 7 x64 SP1 を使用しています。私のプロセスは、VC++ 2010 SP1 で構築された 32 ビット プロセスです。Win 7 のデフォルトである Low Fragmentation Heap を使用しています。HeapQueryInformation でも確認しました。私が使用している VC2010 C ランタイムは、次の方法でヒープを作成します。

のドキュメントによると、HeapCreateは512KB を超えるブロックHeapAllocを自動的に呼び出します。VirtualAlloc

malloc()これがメモリ不足でない場合、一体何が失敗する可能性がありますか? 私の記憶はあまりにも断片的ですか?Windows はヒープを自動的に圧縮すると思っていました。これは本当に奇妙です。私はこれまでにこの動作を見たことがありません。

Windows XP SP3 32 ビットを搭載した別のコンピュータが同じ動作を示しています。

ありがとう、マーティン

0 投票する
1 に答える
1725 参照

linux - mmap は、shm_open ファイル オブジェクトで ENOMEM を返します

Linux で shm_open を試していて、問題が発生しました。ftrunc を使用して共有メモリ セグメントのサイズを頻繁に変更し、mmap を使用してサイズ変更されたセグメントを再マップしています。ただし、20 メガバイト マークのあたりで、mmap から ENOMEM を取得します。

問題を解決するために私がやろうとしたこと:

まず、これらの sysctl パラメータについて知りました。私はそれらを再構成しました:

(shmallはページ単位で指定)

この後も問題は発生しました。問題の原因となったサイズ変更の詳細を調査したところ、共有メモリ オブジェクトのサイズを変更するために行われた ftrunc の呼び出しが成功したことが明らかになりました (/dev/shm 内の対応するファイルは、要求された新しいサイズを持っていました)。

ここのドキュメントhttp://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.htmlは、ENOMEM errnoの3つの考えられる原因を示唆しています:


[ENOMEM] MAP_FIXED が指定されましたが、範囲 [addr,addr+len) がプロセスのアドレス空間に許可されている範囲を超えています。または、MAP_FIXED が指定されておらず、マッピングを有効にするための十分なスペースがアドレス空間にない場合。

[ENOMEM] [ML] [Option Start] mlockall() で必要な場合、マッピングをメモリにロックできませんでした。これは、システムが提供できるよりも多くのスペースが必要になるためです。【オプション終了】

[ENOMEM] [TYM] [Option Start] fildes で指定された型付きメモリ オブジェクトに、len バイトを割り当てるのに十分な未割り当てのメモリ リソースが残っていません。【オプション終了】


MAP_FIXED またはロックを使用していません。/dev/shm のイメージのサイズは、3 番目の理由が問題ではないことを示唆しています。私の mmap 呼び出しは次のようになります。

mmap(メモリ、長さ、PROT_READ | PROT_WRITE、MAP_SHARED、fd、0)

ここで、mem は最初は 0 で、その後は最後に正常にマップされたアドレス mmap を参照します。

ulimit 設定がメモリ マップ可能なプロセスを 1 つのプロセスに制限している可能性があることを示唆する情報を見つけましたが、ここに問題があるとは思いません。念のため、私のマシンでは ulimit -a は次のようになります。

これが簡単なものであることを願っています:)

0 投票する
2 に答える
236 参照

zlib - ENOMEM につながる gzopen() の原因

gdbを使用して新しい (まだ存在しない) 圧縮ログ ファイルを開こうとしている合計メモリ フットプリントが約 100 MiB のプログラムがあります (上部の VM サイズ、停止中) gzopen。システムには 6 GB のメモリが完全に空いており (キャッシュを保持していない)、ファイルシステムに多くのスペースがあるにもかかわらず (それは であることはわかっています)、これは にerrno設定すると失敗します。これを引き起こす可能性のあるもっとあいまいな問題はありますか? ライブラリ内の何かが、正当な理由もなく、何ギガバイトものメモリを偶発的に割り当てていますか?ENOMEMENOSPC

注記として、私の ulimits は無制限に設定されています。

0 投票する
0 に答える
725 参照

c++ - C++ での popen() および system() 呼び出しによる ENOMEM の診断

私は、呼び出しを使用して他の実行可能ファイルを呼び出す計算物理学用の巨大な C++ コード (私が書いたわけではありません) を扱っていsystem()ます。シミュレーションの途中で、これらのsystem()呼び出しが単純な呼び出しであっても失敗することがありsystem("echo something);ます。失敗すると、すぐに戻り値 -1 が返されます。

これらの他の実行可能ファイルを起動するpopen()代わりに使用するバージョンのコードを作成しました。system()このバージョンでは、popen() が失敗し、errno が 12 (ENOMEM) に設定されます。

これは、Torque PBS システムを介して CentOS 6.3 (ROCKS 6.1 経由) を実行する 96GB の RAM を搭載したマシンで実行されています。

この動作はあまり一般的ではありませんが、大量のメモリを使用するシミュレーションで発生するようですが、使用可能なメモリの量よりもはるかに少ないことに注意してください。

現在、この動作を示すシミュレーションを実行しています。system()30 秒ごとに呼び出しを試みて失敗するため、OS のメモリ リソースを監視できます。の内容は/proc/meminfo

/proc/5939/status(問題のプロセスである)の内容は

この問題をデバッグする方法に少し途方に暮れています。特に、小規模なシミュレーションでは再現できないためです。私のシミュレーションでは、47 GB のメモリを使用していることが/proc/meminfo示されていますが、96 GB のメモリのうち 2 GB 未満が空きであり、数十 GB のメモリを使用するものは他に実行されていないはずです。

このフォーラムは、以前のメモリ エラーによってヒープが破損した可能性があることを示しているようです。これは有効な可能性ですか?この問題を絞り込むのに役立つ他に何を見ることができますか?

0 投票する
1 に答える
323 参照

macos - shmget は、12GB の空き容量がある ENOMEM を返します

shmget() を使用して 22MB の共有メモリを割り当てようとしましたが、errno ENOMEM で終了します。top の出力の最初の行は、十分なメモリがあるかのように見えます。

このプログラムは、OS X バージョン 10.8.5 で実行されます。何が原因でしょうか?

0 投票する
1 に答える
118 参照

linux - 利用可能な空きメモリに基づいてフォークされた子プロセスの数を制御する

私は COW を利用して、Linux システム メモリが許す限り多くの子プロセスをフォークしようとしています。fork 部分 (プロセスが一定量のメモリを使用している時点) まで親プロセスを開始し、次に fork が ENOMEM エラーを返すまで一度に 1 つの子を fork します。その場合、新しい子をフォークする前に、子が完了するのを待ちます。子プロセスは新しいメモリを割り当てませんが、動作します。しかし、これは機能しません。すべてのプロセスが Linux システムによって強制終了され、メモリ エラーは発生しませんでした。

それを行う最良の方法は何ですか?

0 投票する
5 に答える
4059 参照

c - 親プロセスの仮想メモリ空​​間を継承せずにプロセスをフォークすることは可能ですか?

親プロセスが大量のメモリを使用しているため、カーネル オーバーコミット ポリシーの構成によってforkは失敗する場合がerrnoあります。ENOMEM子プロセスは、execls のような低メモリ消費プログラムのみである可能性があります。

問題を明確にするために、/proc/sys/vm/overcommit_memory が 2 に設定されている場合、(仮想) メモリの割り当ては に制限されSWAP + MEMORY * ration(default to 50%)ます。プロセスが fork するとき、COW のおかげで仮想メモリはコピーされません。ただし、カーネルは仮想メモリ空​​間を割り当てる必要があります。類推として、fork は物理メモリを割り当てない malloc(仮想メモリ空​​間サイズ) に似ており、共有メモリに書き込むと仮想メモリのコピーが発生し、物理メモリが割り当てられます。overcommit_memory が 2 に設定されている場合、仮想メモリ領域の割り当てが原因で fork が失敗することがあります。

fork以下の条件で、親プロセスの仮想メモリ空​​間を継承しないプロセスは可能ですか?

  1. exec子プロセスが後で呼び出す場合fork

  2. 子プロセスが呼び出さexecれず、親プロセスからのグローバル変数または静的変数を使用しない場合。たとえば、子プロセスはログを記録してから終了します。