문제

32 비트 .NET 프로세스에서 왜 1,000MB 이상의 메모리를 할당 할 수 없는지 궁금합니다. 다음 미니 응용 프로그램은 1,000MB를 할당 한 후 OutofMemoryException을 던졌습니다. 왜 1,000MB, 1.8GB를 말하지 않습니까? 변경할 수있는 프로세스 전체 설정이 있습니까?

static void Main(string[] args)
{
    ArrayList list = new ArrayList();
    int i = 0;
    while (true)
    {
        list.Add(new byte[1024 * 1024 * 10]); // 10 MB
        i += 10;
        Console.WriteLine(i);
    }
}

추신 : 쓰레기 수집은 도움이되지 않습니다.

내가 원하는 것을 명확히하기 위해 편집 : 데이터베이스/디스크에 쓰기 전에 매우 많은 양의 데이터를 다루는 서버 응용 프로그램을 작성했습니다. 모든 것을위한 임시 파일을 만드는 대신, 나는 메모리 인 캐시를 작성하여 모든 것을 매우 빠르게 만듭니다. 그러나 메모리는 제한되어 있으므로 한계가 무엇인지 알아 내려고 노력했습니다. 그리고 내 작은 테스트 프로그램이 정확히 1,000MB 이후 OutofMemoryException을 던진 이유가 궁금했습니다.

도움이 되었습니까?

해결책

Win32 프로세스의 가상 주소 공간 한계는 1.5GB입니다 (완전히 사실은 아닙니다). 또한 .NET 프레임 워크에는 .NET 프로세스가 소비 할 수있는 메모리의 %에 대한 리미터가 있습니다. machine.config에는 프로세스가 소비 할 수있는 가용 메모리의 % 인 속성 메모리 리미트가있는 프로세스 모델 요소가 있습니다. 기본값은 60%입니다.

실행중인 시스템에 2GB의 메모리가 있거나 Boot.ini에서 /3GB 스위치를 활성화하지 않은 경우 프로세스 당 ~ 1.3GB의 메모리를 얻게됩니다.

KB 기사를 찾을 수 없지만 제대로 기억하면 .NET 1.x는 설정에 관계없이 1.5GB (1.8GB?) 한계를 넘어선 다를 수 없습니다.

http://blogs.msdn.com/tmarq/archive/2007/06/25/some-history-on-the-asp-cache-mory-limits.aspx http://social.msdn.microsoft.com/forums/en-us/clr/thread/c50ea343-b41b-467d-a457-c5a735e4dfff http://www.guidanceshare.com/wiki/asp.net_1.1_performance_guidelines_-_caching#caching_the_memory_limit

다른 팁

64 비트에서도 엄청난 기억 블록을 갖는 것은 결코 좋은 생각이 아닙니다. 인접한 메모리와 조각화로 큰 문제가 발생합니다.

여기서 문제는 인접한 블록을 찾는 것입니다. 3GB 모드를 활성화하려고 시도 할 수 있습니다 (몇 바이트를 찾는 데 도움이 될 수 있음). 진짜 그것에 대해 조언합니다. 여기서 답은 다음과 같습니다.

  • 덜 메모리를 사용하십시오
  • 데이터베이스/파일 시스템을 사용하십시오
  • x64를 사용하십시오

당신은 또한 읽고 싶을 수도 있습니다 에릭 립퍼트 블로그 (그는 모든 일반적인 .NET 질문에 대한 블로그 항목이있는 것 같습니다 ...)

나는 최근 32 비트 프로세스에서 .NET의 메모리 제한에 대해 광범위한 프로파일 링을 해왔습니다. 우리는 모두 .NET 응용 프로그램에서 최대 2.4GB (2^31)를 할당 할 수 있다는 생각에 충격을 받았지만 불행히도 이것은 사실이 아닙니다. 그러나 우리를 위해 그것을 관리하는 경우, .NET 자체는 메모리 제한을 넓히는 일반적인 실제 애플리케이션에 대해 약 600-800MB를 차지하는 자체 오버 헤드가있는 것으로 보입니다. 이는 취향에 걸리는 정수 배열을 할당하자마자 의미합니다. 1.4GB, OutOfMemoryException ()을 볼 수 있어야합니다.

분명히 64 비트 에서이 한계는 나중에 (5 년 안에 채팅하자)이지만, 메모리의 모든 것의 일반적인 크기도 단어 크기가 증가하기 때문에 자랍니다 (~ 1.7 ~ ~ 2 배).

내가 확실히 아는 것은 운영 체제의 가상 메모리 아이디어가 하나의 프로세스 내에서 사실상 끝없는 할당 공간을 제공하지 않는다는 것입니다. 전체 2.4GB가 한 번에 실행중인 모든 (많은) 응용 프로그램에 대해 주소를 지정할 수 있도록 만 있습니다.

이 통찰력이 다소 도움이되기를 바랍니다.

나는 원래 여기에 관련된 무언가에 대답했다 (나는 여전히 새로운 사람 이므로이 링크를 어떻게 해야하는지 잘 모르겠다).

단일 .NET 프로세스에 대한 메모리 제한이 있습니까?

64 비트 아키텍처에 응용 프로그램을 구축하여 ~ 2GB보다 훨씬 더 많은 메모리를 할당 할 수 있습니다. 이는 Visual Studio에서 새 빌드 구성을 만들어야하며 응용 프로그램 빌드는 64 비트 버전의 Windows에서만 실행됩니다. . .NET에서 응용 프로그램에 기본 "모든 CPU"빌드 옵션을 사용하여 힙에서 약 1.5GB의 메모리 만 할당 할 수 있습니다 (64 비트 Windows 시스템에서도). "모든 CPU"모드로 내장 될 때 32 비트 모드에서만 실행됩니다. 그러나 X64 아키텍처로 컴파일하면 응용 프로그램 실행 중에 더 많은 메모리를 더 많이 할당 할 수 있으며 아래 애플리케이션을위한 X64 빌드를 만드는 방법을 설명합니다.

다시 말하지만, .NET 프로젝트에서 일반 (기본) "모든 CPU"빌드 옵션을 사용하면 응용 프로그램은 항상 64 비트 Windows OS에서도 32 비트 모드에서 실행됩니다. 따라서 응용 프로그램 실행 중에 약 1.5 ~ 2GB의 RAM 메모리를 할당 할 수 없습니다. True 64 비트 모드로 .NET 응용 프로그램을 실행하려면 빌드 구성 관리자로 이동하여 X64 아키텍처를위한 빌드 유형을 만들고 해당 빌드 유형을 사용하여 X64를 위해 프로그램을 다시 컴파일해야합니다. 다음 단계를 사용하여 .NET 솔루션을 위해 X64 빌드 모드 옵션을 만들 수 있습니다.

  1. Visual Studio "Solution Explorer"Pane에서 솔루션 아이콘을 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 "Configuration Manager"옵션을 선택하십시오. .NET 솔루션 파일의 빌드 "Configuration Manager"대화 창이 열립니다.
  2. "구성 관리자"빌드의 상단, 오른쪽에서 "Configuration Manager"대화 상자의 상단에서 아래쪽 화살표를 클릭하고 선택하십시오. "u003Cnew> "옵션."새로운 솔루션 플랫폼 "대화 상자가 열립니다.
  3. "새로운 솔루션 플랫폼"대화 상자에서 "플랫폼"옵션의 경우 드롭 다운 메뉴에서 "x64"를 선택하십시오. 그런 다음 "OK"버튼을 클릭하면 구성 관리자 대화 상자에서 새로운 X64 빌드 옵션을 사용할 수 있습니다.
  4. 그런 다음 "Configuration Manager"대화 상자에서 "Active Solution Platform"드롭 다운 메뉴에서 "x64"를 선택하십시오. "닫기"버튼을 클릭하십시오.
  5. Visual Studio "Solution Explorer"창에서 CS 프로젝트 아이콘을 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴 (이 메뉴 하단의 마지막 옵션)에서 "속성"옵션을 선택하십시오. CS 프로젝트 속성 창이 열립니다.
  6. CS 프로젝트 속성 창의 왼쪽에서 "빌드"탭을 클릭하여 코드 프로젝트의 빌드 속성을 표시하십시오. 이 창의 상단에서 "플랫폼"은 이제 "x64"라고 말해야합니다 (기본 "CPU"옵션과 반대로). "플랫폼"드롭 다운에 "x64"가 표시되지 않으면 지금 선택해야합니다.
  7. 그런 다음 코드를 빌드하고 "Bin"폴더에서 이제 새로운 응용 프로그램의 새로운 64 비트 빌드가있는 X64 폴더가 있어야합니다.

64 비트 Wind 이 응답을 작성하는 시점에서 실제 제한 요인입니다).

응용 프로그램에서 여전히 메모리가 부족한 경우 Windows 메모리 페이지의 크기를 늘릴 수도 있습니다. Windows에서 페이지 파일을 사용하면 운영 체제가 RAM 메모리 공간이 떨어지면 메모리가 RAM에서 디스크로 이동할 수 있습니다. 그러나 RAM 메모리의 섹션을 디스크로 이동하는 데 큰 시간이 걸리므로 응용 프로그램의 성능에 실제로 인기가있을 수 있습니다. 성능에 관계없이 페이지 크기를 늘리면 이론적으로 Windows 머신의 C : 드라이브에 무료 공간이있는 것처럼 페이지 파일을 크게 만들 수 있습니다. 이 경우 응용 프로그램은 프로그램 실행 중에 최대 4TB의 메모리 (또는 페이지 파일 크기가 설정된 메모리 양)를 할당 할 수 있습니다. Windows 시스템의 페이지 파일 설정을 변경하려면 다음을 수행하십시오.

  1. "이 PC"를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 "속성"옵션을 선택하여 "시스템 속성"대화 상자를 엽니 다. 이것은 또한 "시작"> "제어판"> "시스템 및 보안"> "시스템"으로 이동하여 이후 버전의 Windows (Windows 10, Win 2012 서버 등)에서도 달성 될 수 있습니다.
  2. "시스템"대화 상자의 왼쪽에서 "고급 시스템 속성"옵션을 클릭하십시오. Windows의 "레거시"시스템 속성의 "고급"탭이 표시됩니다.
  3. "시스템 속성"대화 상자의 "고급"탭에서 "성능"상자에서 "설정"버튼을 클릭하십시오. "성능 옵션"대화 상자가 열립니다.
  4. "Performance Options"대화 상자에서 "고급"탭을 클릭하여 Windows 메모리 페이지 파일의 현재 크기 설정을 확인하십시오.
  5. 페이지 파일 크기를 늘리려면 "변경"버튼을 클릭하면 "가상 메모리"대화 상자가 열립니다.
  6. "가상 메모리"대화 상자에서 "C :"드라이브를 선택한 다음 "사용자 정의 크기"아래에서 "초기"및 "최대"크기를 설정하십시오. C : 드라이브의 최대 여유 공간까지 모든 크기를 사용할 수 있지만이 변경으로 인해 하드 드라이브의 페이지 파일의 해당 공간이 예약됩니다.
  7. 그런 다음 모든 대화 상자에서 "확인"을 클릭하여 새 설정을 커밋합니다. 그런 다음 컴퓨터를 재부팅하여 모든 변경 사항이 올바르게 완료되었으며 새 페이지 파일 설정이 작동하는지 확인하십시오.

어쨌든, 이것이 64 비트 Wind 이것은 사람들에게 매우 혼란스러운 문제가 될 수 있으며 내 설명이 의미가 있기를 바랍니다. 필요한 경우이 답변에 대한 질문으로 저에게 메시지를 보내 주시기 바랍니다.

여기서 문제는이 응용 프로그램이 모든 루프에 10MB를 추가 할 것이며 루프는 "while (true)"이라는 것입니다. 따라서 100 루프로 실행되면 1GB에 RAM에 가까운 곳에 추가되었을 것입니다. 30 초 이내에이 작업을 수행했다고 가정합니다. 내 요점은 당신이 끝없는 루프에서 루프 당 10 메가 바이트의 메모리를 시도하고 있다는 것입니다.

당신의 요점을 얻지 못하면 정말 죄송합니다.

static void Main(string[] args)
{
    ArrayList list = new ArrayList();
    int i = 0;
    while (true)
    {
        using(byte newBt = new byte[1024 * 1024 * 10])
        {
            list.Add(newBt); // 10 MB
            i += 10;
            Console.WriteLine(i);
        }
    }
}

사용 방법을 사용해 보셨습니까? 그리고 이것은 어리석은 질문일지도 모르지만 왜 당신은 왜 영원한 고리를 만들었습니까? o 코드 스트립을 시도한 경우 기호>.> XD.

원천: http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top