가비지 수집기 (GC)가 결국이 작업을 수행합니다. 여러분이 제안한 것과 같은 경우 GC는이 경우 GC가 가비지 수집과 응용 프로그램 메모리 소비 (작업 집합)를 비교하는 데 소요되는 시간을 관리하고 관리하므로주의해야합니다. 결과적으로 응용 프로그램은 사용자가 설명하는 경우 특히 필요로하는 것보다 많은 메모리를 소비 할 수 있습니다.
CLR은이 메모리를 완전히 자동으로 처리하므로 관리되는 메모리를 직접 할당 취소하지 마십시오. 예를 들어 다음을 고려
public void Test()
{
byte[] myArray = new Byte[1000];
// ...
}
Test
이 실행이 1000 바이트를 저장할 배열 메모리 힙에 할당 될 때. 배열은 변수 myArray
에 의한 참조이며 로컬 변수 스택에 저장됩니다. 이 메서드가 종료되면이 로컬 변수가 범위를 벗어나 튀어 나와 메모리 힙의 배열을 참조하는 데 아무 것도 남지 않습니다. 분리 된 배열은 GC에 의해 재 확보 될 자격을 갖게됩니다.그러나 CLR이 수집할지 여부에 대한 결정은 여러 가지 요소 (사용 가능한 메모리, 현재 메모리 할당, 마지막 수집 이후 시간 등)를 기반으로하므로 즉시 수행되지 않을 수 있습니다. 즉, 쓰레기 수거 전의 시간.
위에서 설명한 것처럼 루프/포함 메서드의 지속 기간 동안 메모리 소비가 크게 증가합니다. 여기에는 using
문
while (true)
{
using (Image<Gray, Byte> MyImage = new Image<Gray, Byte> (1024, 768))
{
// ...
}
}
또는 각 루프 후 Image
객체에 dispose()
를 호출을 사용하거나 훨씬 낫다.
while (true)
{
Image<Gray, Byte> MyImage = new Image<Gray, Byte> (1024, 768);
// ...
MyImage.Dispose();
}
Asside : 당신은 항상 자신을 위해 메모리 소비를 체크 아웃 (System.Diagnostics 네임을 사용하여) 성능 카운터를 쿼리하여 (귀하의 프로세스 실제 메모리 소비를 테스트) 할 수
string procName = Process.GetCurrentProcess().ProcessName;
using (PerformanceCounter pc = new PerformanceCounter("Process", "Private Bytes", procName))
Console.WriteLine(pc.NextValue());
주 읽기 성능 카운터에는 관리자 권한이 필요합니다.
나는 추측 할 위험이 있으며 그렇다고 대답하지만, 100 % 확신 할 수는 없으므로 복음으로 받아들이지 마십시오. – Richard
@Killercam 확실한가요? 나는 뭔가 다른 것을 듣기 때문에 나는 모른다. 이 경우 이미지 객체가 괜찮다는 의미입니까, 일반적으로 말합니까? – YankeeWhiskey