.NET 메모리 부족 예외-1.3GB를 사용했지만 16GB가 설치되어 있습니다.


91

응용 프로그램의 메모리 사용량이 약 1.3GB를 초과하면 C # 응용 프로그램에서 메모리 부족 예외가 발생합니다.

3GB의 메모리가있는 32 비트 컴퓨터에서 동일한 문제가 발생했고 당시에는 이치에 맞았지만 이제는 하드웨어를 고급 마더 보드와 RAM이있는 16GB 메모리가있는 64 비트 컴퓨터로 업그레이드했지만 메모리 부족 1.3GB 후에도 예외가 계속 발생합니다!

2GB 이상의 단일 개체가없고 1.3은 어쨌든 2GB보다 적다는 것을 알고 있으므로 단일 개체에 대한 내장 MS 2GB 제한은 문제가되지 않을 것입니다.

앱이 특정 메모리 사용 임계 값에 도달하면 일종의 Windows 킬 스위치가있는 것 같습니다. 그러면이를 구성하는 방법이 레지스트리에있을 수 있습니다.

어떤 도움이라도 대단히 감사하겠습니다!


9
OS도 64 비트입니까?
fge

9
당신의 OS가 64 비트 인 경우에도, 프로세스는 64 비트 (또는 anycpu를)인지 확인
Knowleech

답변:


90

동일한 대상 아키텍처로 컴파일 할 때까지 차이가 ​​없습니다 . 나는 가정 당신이 컴파일하는 32두 경우 모두에서 비트 아키텍처.

아키텍처 와 비트 모두 에서 CLR (예 :) 의 단일 컬렉션에 의해 할당 된 메모리 OutOfMemoryException를 얻는 경우에도 발생할 수 있다는 점을 언급 할 가치가 있습니다 .2GBList<T>3264

64비트 아키텍처의 메모리 장점을 활용하려면 비트 아키텍처를 대상으로하는 코드 를 컴파일 해야합니다 64. 그 후, 자연스럽게, 바이너리가 실행됩니다 64비트,하지만 가능성 RAM에서 사용할 수있는 더 많은 공간을 가지고 도움이됩니다.


8
AnyCPU는 어떻습니까?
dtb

1
예, AnyCPU도 옵션이며 JIT 아키텍처 종속 코드에 대한 옵션이 있습니다. 그러나 관리되지 않는 (예 :) 리소스가있는 경우 특정 아키텍처를 대상으로 지정하면 여전히 이점을 얻을 수 있습니다. 나는 OP의 아키텍처가 무엇인지 전혀 모른다.
Tigran 2013 년

4
나는 그것을 알고 있었다 :)-Tigran에게 감사합니다. x64로 솔루션을 다시 빌드했고 예외는 사라졌습니다.
Paceman 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로 올린 후 확인 된 문제가 있습니까?
Maverick

28

이제 '모든 CPU'컴파일의 기본값이 '32 비트 선호 '확인란을 선택한다는 점을 언급 할 가치가 있습니다. 16GB RAM이있는 64 비트 OS에서 AnyCPU로 설정되어 있으면이 옵션을 선택하면 2GB에서 메모리 부족 예외가 발생할 수 있습니다.

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 증가 유저 바 3072
  5. 다시 2 단계를 수행하고 매개 변수를 확인합니다.

이 설정을 추가하고이 블록이 시작되었습니다.

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

추가 정보-명령 increaseuserva: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--set

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.