C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

  C# 코딩 중 평소 볼 수 없던 생소한 현상이 발생했습니다. 분명 메모리는 남아도는데(32기가바이트 중 26기가바이트 사용 가능) 프로그램이 돌다가 OutOfMemory 예외를 던지며 죽어버리는 현상이었죠. List에 수많은 파싱된 데이터를 넣는 작업 중이었습니다.

  그래서 메모리 프로파일러를 잘 관찰해보니 2GB의 메모리를 사용하면 무조건 뻗어버리는 현상을 발견했고, 왜 그럴까 생각해보다가 문득 예전 XP에서 4기가 메모리를 달아도 32비트 운영체제의 한계 아닌 한계로 3기가 조금 넘게밖에 인식을 못 했던 것이 생각났습니다. 생각은 자연스럽게 컴파일이 32비트로 됐구나! 쪽으로 넘어갔고 프로젝트 설정에 보니 빌드 항목에 해당되는 체크박스가 있더군요.

  현재 메모리가 남아도는데도 OutOfMemory 예외가 뜬다면 100% 저게 체크된 상태일 겁니다. 그림과 같이 체크 해제하신 후 실행하시면 특별한 경우가 아닌 이상 컴퓨터 메모리가 바닥날 때까지 저 예외를 볼 일 없게 될겁니다.

댓글

  1. 덕분에 해결했네요. 감사합니다.

    답글삭제
  2. 정말 감사합니다. 몇 시간 째 진이 다 빠져 있었는데 해결했어요. 감사합니다 복받으세요

    답글삭제
  3. 궁금한 점이 있습니다. 시작 프로젝트 빌드 플랫폼이 x86이고, 제 프로젝트가 Any CPU일 때 실제 제 프로젝트는 어떤 플랫폼 기반으로 실행이 될까요?

    답글삭제
    답글
    1. 닷넷 코드를 빌드하면 MSIL(중간 언어)으로 컴파일됩니다. 이 IL을 CLR이 JIT 컴파일을 통해 각 머신에 맞는 네이티브 바이너리로 실행시킵니다.

      따라서 Any CPU 구성으로 빌드하면 JIT 컴파일러가 실행되는 머신의 환경에 따라 IL을 x86으로 컴파일할지 x64로 컴파일할지 정하게 됩니다.

      네이티브 라이브러리를 사용하지 않는 환경이라면 대부분의 경우 Any CPU로 빌드하면 되지만, 어떠한 네이티브 바이너리(예: OpenCV 등)가 특정 플랫폼에서만 동작한다면 이 때에는 빌드 구성을 해당 플랫폼에 맞게 지정하고 빌드해야 올바르게 실행됩니다.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭

테일즈위버 OST 전곡 모음