web-dev-qa-db-ja.com

.NETメモリ不足例外-1.3GBを使用しましたが、16GBがインストールされています

アプリケーションのメモリ使用量が約1.3GBを超えると、c#アプリケーションでメモリ不足例外が発生します。

3 GBのメモリを搭載した32ビットマシンでも同じ問題が発生し、当時は理にかなっていましたが、ハードウェアをハイエンドマザーボードとRAMを搭載した16 GBメモリの64ビットマシンにアップグレードしました_ただし、1.3GBを超えるとメモリ不足例外が発生します!

私は2GBを超える単一のオブジェクトはなく、1.3は2GBよりも小さいことを知っているので、単一のオブジェクトに組み込まれたMS 2GBの制限は問題ではない可能性があります...

アプリが特定のメモリ使用量のしきい値に達すると、何らかの種類のWindows Kill-Switchがあるように見えます...それをレジストリに設定する方法があるはずです。

どんな助けも大歓迎です!

80
Paceman

同じターゲットアーキテクチャにcompileするまで違いはありません。 Ipose両方のケースで32ビットアーキテクチャ用にコンパイルしていると仮定します。

OutOfMemoryException は、 CLR (たとえば 2GB )で単一のコレクションによって割り当てられたメモリのList<T>を取得した場合にも発生する可能性があることに言及する価値があります両方のアーキテクチャ32および64ビット。

64ビットアーキテクチャでメモリの利点を活用するには、64ビットアーキテクチャをターゲットとするコードをcompileする必要があります。その後、当然、バイナリは64ビットでonlyで実行されますが、RAMで使用可能なスペースが増える可能性があります。

84
Tigran

既に述べたように、x64でアプリをコンパイルすると、使用可能なメモリがはるかに多くなります。

ただし、x86でアプリを構築する必要がある場合は、メモリ制限を1,2GBから4GBに上げる方法があります(32ビットプロセスの実際の制限)。

Visual StudioインストールディレクトリのVC/binフォルダーには、editbin.exeファイルが必要です。だから私のデフォルトのインストールでは、私はそれを見つけます

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe

プログラムを機能させるには、最初に同じディレクトリでvcvars32.batを実行する必要があります。それから

editbin /LARGEADDRESSAWARE <your compiled exe file>

プログラムで4GB RAMを使用するには十分です。 <your compiled exe file>は、プロジェクトのコンパイル中にVSが生成したexeです。

プロジェクトをコンパイルするたびにこの動作を自動化する場合は、実行されたプロジェクトに対して次のビルド後イベントを使用します。

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

補足:Visual Studioで1.2GBの代わりに4GB RAMを使用するために、devenv.exeでも同じことができます(ただし、最初に古いdevenv.exeをバックアップします)。

58
Desty

「Any CPU」コンパイルのデフォルトでは、「Prefer 32bit」チェックボックスがオンになっています。 AnyCPUに設定されている場合、16ビットのRAMを搭載した64ビットOSでは、これをチェックすると2GBのメモリ不足例外が発生する可能性があります。

Prefer32BitCheckBox

19
tonycoupland

64ビットArchを使用しているように見えますが、32ビットバージョンの.NETランタイムや32ビットバージョンのWindowsがあります。

そのため、プロセスで使用できるアドレス空間は同じままで、以前の設定から変更されていません。

64ビットOSと64ビット.NETバージョンの両方にアップグレードしてください;)

2
fge

アプリケーションは64ビットまたは32ビットプロセスとして実行されていますか?これはタスクマネージャーで確認できます。

システム全体が64ビットで実行されていても、32ビットとして実行されている可能性があります。

32ビットの場合、サードパーティのライブラリがこれを引き起こしている可能性があります。ただし、コメントに記載されているように、まずアプリケーションが「任意のCPU」用にコンパイルされていることを確認してください。

1
Jacco

この方法は、次の設定なしでは機能しません。

  1. プロンプトcmd.exeを実行します(重要:管理者として実行)
  2. bcdedit.exeと入力して実行します
  3. 「increaseuserva」パラメータを見て、次のステートメントを書くことはありません
  4. bcdedit/set incrementuserva 3072
  5. そして再びステップ2とparamsを確認してください

この設定を追加して、このブロックを開始しました。

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)
0
Mehmet Kurt