16GB RAM이 장착 된 Windows Server 2008 x64에서 .NET 응용 프로그램 실행. 이 애플리케이션은 매우 많은 양의 데이터 (약 64GB)를 가져와 분석하고 한 번에 전체 메모리에 보관해야합니다..NET 가비지 컬렉터 및 x64 가상 메모리
예상되는 내용 : 프로세스 크기가 16GB에서 64GB로 확장됩니다. Windows는 가상 메모리를 사용하여 필요에 따라 디스크에 추가 데이터를 페이징합니다. 이것은 고전적인 가상 메모리 사용 사례입니다.
실제로 보는 내용 : 프로세스 크기는 실제 메모리 크기 (16GB)로 제한됩니다. 응용 프로그램은 시간의 99.8 %를 가비지 수집기에 소비합니다.
응용 프로그램에서 가상 메모리를 사용하지 않는 이유는 무엇입니까? 이 문제는 .NET 가비지 수집기의 구성 또는 Windows x64 가상 메모리 관리자 자체의 구성에 문제가 있습니까? 실제 메모리에 국한되지 않고 가상 메모리를 사용하도록 응용 프로그램을 만들려면 어떻게해야합니까?
감사합니다.
- 브라이언
업데이트 : 당신이 그것을 시도하려는 경우
using System;
namespace GCTest
{
class Program
{
static void Main()
{
byte[][] arrays = new byte[100000000][];
for (int i = 0; i < arrays.Length; ++i)
{
arrays[i] = new byte[320];
if (i % 100000 == 0)
{
Console.WriteLine("{0} arrays allocated", i);
System.Threading.Thread.Sleep(100);
}
}
}
}
}
것은, 64에 대한 구축해야합니다 : 나도 같은 행동을 나타내는 아주 작은 프로그램을 작성했습니다. 시스템에 스트레스를주기 위해 상수를 약간 수정해야 할 수도 있습니다. 내가 보는 행동은 프로세스가 16GB의 크기에 접근함에 따라 문제가 발생한다는 것입니다. 오류 메시지 또는 예외가 발생하지 않습니다. 성능 모니터는 GC의 CPU 시간 비율이 100 %에 도달 함을보고합니다.
이것은 용납되지 않습니까? 가상 메모리 시스템은 어디에 있습니까?
프로세스의 크기를 결정하기 위해 무엇을 사용하고 있습니까? (그냥 쉬운 옵션을 먼저 없애자 :) – Paolo
Windows 작업 관리자에서 "커밋 크기". 또한 "# 전체 커밋 된 바이트"성능 모니터를 사용하여. 나는 물리적 인 작업 세트보다는 프로세스의 가상 메모리 크기를 측정하고 있다고 확신한다. – brianberns
분명히 물어볼 수 있습니까? _ 모든 메모리를 한번에 메모리에로드해야합니까? 다른 접근 방식을 취하고 수동으로 일종의 수동 페이징을 할 수 있습니까? – CodingGorilla