. Net bez pamięci-używany 1.3 GB, ale ma zainstalowane 16GB

Otrzymuję wyjątek Out of Memory w mojej aplikacji c#, gdy zużycie pamięci dla aplikacji przekroczy około 1.3 GB.

Miałem ten sam problem na 32-bitowej maszynie z pamięcią 3GB i wtedy miało to sens, ale teraz zaktualizowałem sprzęt do 64-bitowej maszyny z pamięcią 16GB z wysokiej klasy płytą główną i RAM, ale wyjątek Out of Memory nadal występuje po 1,3 GB!

Wiem, że nie ma pojedynczych obiektów powyżej 2GB, a 1.3 to i tak mniej niż 2GB, tak więc wbudowany limit MS 2GB na pojedynczym obiekcie prawdopodobnie nie będzie problemem...

Wygląda na to, że istnieje jakiś wyłącznik awaryjny systemu windows, gdy aplikacja osiąga określony próg wykorzystania pamięci... Następnie powinien być sposób, aby skonfigurować to jest w rejestrze być może?

Każda pomoc będzie bardzo mile widziana!

Author: Paceman, 2013-01-07

6 answers

Nie ma różnicy dopóki nie skompilujesz do tej samej architektury docelowej. I przypuszczam, że kompilujesz dla 32 architektury bitowej w obu przypadkach.

Warto wspomnieć, że OutOfMemoryException Może być również podniesiony, jeśli otrzymasz 2GB pamięci przydzielonej przez pojedynczy zbiór w CLR (powiedzmy List<T>) na obu architekturach 32 i 64 bit.

Aby móc korzystać z dobroci pamięci na architekturze bitowej, musisz skompiluj swój kod kierujący 64 architekturę bitową. Po tym, oczywiście, twój binarny będzie działał tylko na 64 bit, ale skorzysta z możliwości posiadania więcej miejsca w pamięci RAM.

 81
Author: Tigran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-05 14:23:33

Jak już wspomniano, kompilacja aplikacji w x64 daje znacznie więcej dostępnej pamięci.

[8]} ale w przypadku, gdy trzeba zbudować aplikację w x86, istnieje sposób na podniesienie limitu pamięci z 1,2 GB do 4 GB (co jest faktycznym limitem dla procesów 32-bitowych):

W folderze VC / bin katalogu instalacyjnego Visual Studio musi znajdować się plik editbin.exe. Więc w mojej domyślnej instalacji znajduję go pod

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

Aby program działał, być może trzeba wykonać vcvars32.bat w najpierw ten sam katalog. Następnie a

editbin /LARGEADDRESSAWARE <your compiled exe file>

Wystarczy, aby twój program korzystał z 4GB PAMIĘCI RAM. {[5] } jest exe, który został wygenerowany podczas kompilacji twojego projektu.

Jeśli chcesz zautomatyzować to zachowanie przy każdym kompilowaniu projektu, użyj następującego zdarzenia Post-Build dla wykonanego projektu:

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

Uwaga boczna: to samo można zrobić z devenv.exe, aby Visual Studio również korzystało z 4GB PAMIĘCI RAM zamiast 1,2 GB (ale najpierw wykonaj kopię zapasową starego devenv.exe).

 56
Author: Desty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 17:34:50

Warto wspomnieć, że domyślna dla kompilacji 'Any CPU' sprawdza teraz pole wyboru 'Prefer 32bit'. Jest ustawiony na AnyCPU, w 64-bitowym systemie operacyjnym z 16GB PAMIĘCI RAM może nadal trafić wyjątek out of memory na 2gb, jeśli jest to zaznaczone.

Prefer32BitCheckBox

 15
Author: tonycoupland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 12:06:17

Wygląda na to, że masz 64-bitowy łuk, dobrze -- ale 32-bitową wersję środowiska uruchomieniowego. NET i / lub 32-bitową wersję systemu Windows.

I jako takie, przestrzeń adresowa dostępna dla procesu jest nadal taka sama, nie zmieniła się w stosunku do poprzedniej konfiguracji.

Upgrade do 64-bitowego systemu operacyjnego i 64-bitowej wersji. NET;)

 2
Author: fge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-06 20:14:08

Czy Twoja aplikacja działa jako 64-lub 32-bitowy proces? Możesz to sprawdzić w Menedżerze Zadań.

Może być, działa jako 32bit, mimo że cały system działa na 64bit.

Jeśli 32bit, może to być przyczyną biblioteki innej firmy. Ale najpierw upewnij się, że aplikacja jest kompilowana dla "dowolnego procesora", jak wspomniano w komentarzach.

 1
Author: Jacco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-06 20:21:46

Ta metoda nie działa bez następujących ustawień.

  1. Uruchom polecenie cmd.exe (ważne : Uruchom jako Administrator)
  2. Typ bcdedit.exe I run
  3. spójrz na "increaseuserva" params i nie ma wtedy napisać następujące stwierdzenie
  4. bcdedit / set increaseuserva 3072
  5. i jeszcze raz krok 2 i sprawdź params

Dodaliśmy te ustawienia i ten blok się zaczął.

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)
 0
Author: Mehmet Kurt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 10:37:28