100

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

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

2GBを超える単一のオブジェクトはなく、1.3はとにかく2GB未満であることを私は知っているので、単一のオブジェクトに対する組み込みのMS 2GB制限が問題になる可能性は低い.

アプリが特定のメモリ使用量のしきい値に達すると、何らかの Windows キル スイッチがあるようです。次に、これを構成する方法があるはずです。おそらくレジストリにありますか?

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

4

8 に答える 8

95

同じターゲット アーキテクチャにコンパイルするまで違いはありません。どちらの場合も、ビットアーキテクチャ 用にコンパイルしていると思います。32

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

64ビット アーキテクチャでメモリの利点を活かすには、ビット アーキテクチャを対象とするコード をコンパイルする64必要があります。その後、当然のことながら、バイナリはビット上でのみ64実行されますが、RAM により多くのスペースを使用できる可能性があるというメリットがあります。

于 2013-01-06T20:17:06.827 に答える
67

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

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

VisualStudioインストールディレクトリの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.exe、VisualStudioでも1.2GBではなく4GBのRAMを使用できます(ただし、最初に古いものをバックアップしdevenv.exeます)。

于 2013-01-07T06:28:00.140 に答える
30

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

Prefer32BitCheckBox

于 2016-09-27T12:06:17.703 に答える
2

64 ビット アーチを使用しているようですが、32 ビット バージョンの .NET ランタイムおよび/または 32 ビット バージョンの Windows を使用しています。

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

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

于 2013-01-06T20:14:08.623 に答える
1

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

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

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

于 2013-01-06T20:21:46.723 に答える
0

VS 以外の特定の 32 ビット アプリにより多くのメモリへのアクセスを提供したい場合は、https://github.com/cybertechniques/site/blob/master/analysis_tools/cff-explorer/index に便利なアプリケーションがあります。アプリのヘッダーを設定するmd .

  • NT Core サイトまたは CFF Explorer ファイルから「CFF Explorer」をダウンロードします。
  • 「CFF Explorer」を起動し、EXE を開きます (例: C:\Users\dennisg\AppData\Local\Apps\2.0\MHV1WDDC.958Y0ELE416.L7Y\myapp.exe)。
  • リスト項目

ウィンドウの左側で、[Nt Headers] の下の [File Header] セクションを選択します。右側の [Characteristics] で始まる行と [Click here] フィールドを探します。そこをクリックしてください。(次の部分のコンテキスト メニューが表示されます)。「App can handle >2gb addresses」のチェックボックスを選択/有効にして、「OK」をクリックします。ファイルを保存します ([ファイル] > [保存])。

于 2021-11-19T10:03:27.830 に答える