응용 프로그램의 메모리 사용량이 약 1.3GB를 초과하면 C # 응용 프로그램에서 메모리 부족 예외가 발생합니다.
3GB의 메모리가있는 32 비트 컴퓨터에서 동일한 문제가 발생했고 당시에는 이치에 맞았지만 이제는 하드웨어를 고급 마더 보드와 RAM이있는 16GB 메모리가있는 64 비트 컴퓨터로 업그레이드했지만 메모리 부족 1.3GB 후에도 예외가 계속 발생합니다!
2GB 이상의 단일 개체가없고 1.3은 어쨌든 2GB보다 적다는 것을 알고 있으므로 단일 개체에 대한 내장 MS 2GB 제한은 문제가되지 않을 것입니다.
앱이 특정 메모리 사용 임계 값에 도달하면 일종의 Windows 킬 스위치가있는 것 같습니다. 그러면이를 구성하는 방법이 레지스트리에있을 수 있습니다.
어떤 도움이라도 대단히 감사하겠습니다!
답변
동일한 대상 아키텍처로 컴파일 할 때까지 차이가 없습니다 . 나는 가정 당신이 컴파일하는 32
두 경우 모두에서 비트 아키텍처.
아키텍처 와 비트 모두 에서 CLR (예 🙂 의 단일 컬렉션에 의해 할당 된 메모리 OutOfMemoryException
를 얻는 경우에도 발생할 수 있다는 점을 언급 할 가치가 있습니다 .2GB
List<T>
32
64
64
비트 아키텍처의 메모리 장점을 활용하려면 비트 아키텍처를 대상으로하는 코드 를 컴파일 해야합니다 64
. 그 후, 자연스럽게, 바이너리가 실행됩니다 만 에 64
비트,하지만 가능성 RAM에서 사용할 수있는 더 많은 공간을 가지고 도움이됩니다.
답변
이미 언급했듯이 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.exe
Visual Studio에서도 1.2GB 대신 4GB RAM을 사용하도록 할 수 있습니다 (그러나 먼저 이전 백업 devenv.exe
).
답변
답변
64 비트 아치가있는 것 같지만 32 비트 버전의 .NET 런타임 및 / 또는 32 비트 버전의 Windows가 있습니다.
따라서 프로세스에 사용할 수있는 주소 공간은 여전히 동일하며 이전 설정에서 변경되지 않았습니다.
64 비트 OS 및 64 비트 .NET 버전으로 업그레이드하십시오.)
답변
애플리케이션이 64 비트 또는 32 비트 프로세스로 실행되고 있습니까? 작업 관리자에서 확인할 수 있습니다.
전체 시스템이 64 비트에서 실행 중임에도 불구하고 32 비트로 실행될 수 있습니다.
32 비트 인 경우 타사 라이브러리가 원인 일 수 있습니다. 그러나 먼저 주석에 명시된대로 응용 프로그램이 “모든 CPU”용으로 컴파일되고 있는지 확인하십시오.
답변
32 비트 Windows를 사용하는 경우 다음 설정 없이는이 방법이 작동하지 않습니다.
- 프롬프트 cmd.exe 실행 (중요 : 관리자 권한으로 실행)
- bcdedit.exe를 입력하고 실행하십시오.
- “increaseuserva”매개 변수를 살펴보면 다음 문장을 작성하지 않습니다.
- bcdedit / set 증가 유저 바 3072
- 다시 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
답변
