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


91

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

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

2GBを超える単一のオブジェクトはなく、1.3はいずれにしても2GBを下回るので、単一のオブジェクトに組み込まれているMS 2GBの制限が問題になることはないと思います...

アプリが特定のメモリ使用量のしきい値に達したときに、ある種のWindows kill-switchがあるようです...それから、これをレジストリに構成する方法があるはずですか?

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


9
OSも64ビットですか?
2013年

9
OSが64ビットであっても、プロセスも64ビット(またはAnyCPU)であることを確認してください
Knowleech

回答:


90

同じターゲットアーキテクチャにコンパイルするまで違いはありません。私は仮定あなたがコンパイルされている32いずれの場合においてもビットアーキテクチャ。

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

64ビットアーキテクチャの優れたメモリを活用するには、ビットアーキテクチャをターゲットにしたコードをコンパイルする必要があります 64。その後、当然、バイナリはビット上でのみ実行64ますが、RAMで使用可能なスペースが増える可能性から恩恵を受けます。


8
AnyCPUはどうですか?
dtb 2013年

1
はい、AnyCPUもオプションです。JITアーキテクチャに依存するコードを選択できます。しかし、管理されていない(たとえば)リソースがある場合でも、特定のアーキテクチャを対象とすることは依然としてメリットがあります。OPのアーキテクチャが何であるか私にはわかりません。
Tigran 2013年

4
私はそれを知っていました:)-Tigranのおかげで、x64でソリューションを再構築し、例外はなくなりました。
ペースマン2013年

63

すでに述べたように、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)"
)

補足:devenv.exeVisual Studioで1.2GBではなく4GB RAMを使用できるようにするためにも同じことができます(ただし、最初に古いをバックアップしますdevenv.exe)。


どうもありがとう。これでうまくいきます。しかし、メモリ制限を4GBに増やした後に特定の問題がありますか?
マーベリック

28

「任意のCPU」コンパイルのデフォルトは、「32ビットを優先する」チェックボックスをオンにすることに言及する価値があります。AnyCPUに設定されているため、16 GBのRAMが搭載された64ビットOSでは、これをオンにすると、2 GBでメモリ不足の例外が発生する可能性があります。

Prefer32BitCheckBox


2
これにより、メモリ不足の問題が完全に解決され、フラストレーションが
大幅に軽減されまし

2

あなたは64ビットのアーチを持っているように見えますが、32ビットバージョンの.NETランタイムおよび/または32ビットバージョンのWindowsです。

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

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


1

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

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

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


0

32ビットWindowsを使用している場合、この方法は次の設定なしでは機能しません。

  1. プロンプトcmd.exeを実行します(重要:管理者として実行)
  2. bcdedit.exeと入力して実行します
  3. "increaseuserva"パラメータを見てください。次のステートメントはありません。
  4. bcdedit / set増加userva 3072
  5. そして再びステップ2とparamsをチェックします

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

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

詳細情報-コマンドincreaseuservahttps : //docs.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--set

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.