1

25 GB の RAM を搭載した Windows 2003 エンタープライズ上で実行される C++ で実装されたサーバーがあります。

ストレス テスト中に、_beginthread を呼び出して新しいスレッドを作成しようとしているときに、「メモリ不足」を意味する ENOMEM を取得しました。

しかし、メモリ不足の理由がわかりません。perfmon データは、その時点でプロセスが 1.2 GB の VM と同様の物理メモリを使用し、250 スレッドしかないことを示しています。

なぜこのエラーがまだ発生するのかを分析または説明するのを手伝ってくれる人はいますか?

4

3 に答える 3

2

通常、スレッドには 1 MB のフラグメント化されていないアドレス空間が必要です。ストレス テストでメモリが断片化され、1 MB の拡張が利用できない状態になった場合、新しいスレッドを作成することはできません。これは、最悪の場合、それぞれ 1 バイトを 2000 回割り当てるだけで実現できます。

于 2012-09-11T10:08:28.083 に答える
0

典型的な 32 ビット アプリケーションは、2048 未満のスレッドを作成した後、(仮想) メモリを使い果たします。デフォルトでは、すべてのスレッドが 1MB の連続した仮想アドレス空間を予約するため、2048 スレッドには 2GB の仮想メモリが必要です。これは、32 ビット プロセスがユーザー モードで消費できる最大値です。

PSユーザーモードで最大3GBの仮想アドレス空間を予約するようにOSを構成するオプション(少なくともWindowsでは)があります。

于 2012-09-10T23:56:55.273 に答える
0

アプリケーションのメモリリークが原因でした。

于 2012-10-25T17:44:44.480 に答える