문제

내 코드 :

var list = new LinkedList<int>();
var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
while (true)
{
    for(int i = 0; i < 1000 * 1000; i++) list.AddLast(0);
    Console.WriteLine(ramCounter.NextValue());
}

질문:

  1. 문서는 내가 수행 할 수 있다고 말하는 것 같습니다. 관리자, 그러나 나는 내 신청서를 a로 실행했습니다 표준 사용자 그리고 그것은 효과가있었습니다. 그것에 의존 할 수 있습니까?
  2. 나는 지속적으로 얻습니다 OutofMemoryException 약 200MB RAM이 남아 있으면 ? 한 번에 INT를 할당하기 때문에 조각화로 인한 것일 수 없습니다. 또한 이미 2GB 이상으로 주소 문제로 인한 것일 수 없습니다 (3GB 중 2.8을 사용하면 예외가 발생합니다). 테스트 앱에 의한 숫자는 측면에서 작업 관리자 창을 사용하여 확인되었습니다.
  3. 일단 테스트 앱이 실행될 때 BSOD를 얻었고 약 400MB가 남아있었습니다. 이것을 원인 할 수있는 것에 대한 힌트가 있습니까? 램 무결성을 확인하겠습니다. 전화에주의해야합니다 PerformanceCounter.NextValue() 루프 또는 뭔가? 이 PC에서 BSOD를 처음 얻은 것은 이번이 처음입니다.
  4. 프로그램 실행의 일부 시점에서 큰 지연이됩니다. 예 : 1GB 프리 램에서 시작할 때 700MB에 도달하면 앱이 1 초 동안 얼린 다음 약 400MB에서 약 4 초 동안 동결됩니다. 왜 이런거야? OS가 메모리를 확보하기 위해 디스크 캐시를 교체해야하기 때문에?

메모: 내가 왜 이것을하고 있습니까? 글쎄, 나는 내 메모리 집약적 인 앱이 5MB RAM이 남아있을 때 감지하기를 원하고, 사용자에게 "메모리가 낮으며, 다른 프로그램을 닫고 돌아 오시면이 프로그램이 실패합니다."

도움이 되었습니까?

해결책

나는 당신의 모든 질문을 다룰 수는 없지만 여기에 간다

2) 32 또는 64 비트 창문에 있습니까? 3GB (예 : 32 비트 창)에 액세스하여 대규모 주소 인식 프로세스를 실행하는 것처럼 들립니다. 어쨌든 메모리는 다양한 크기의 척에 메모리가 할당되며 힙 사용이 유일한 소스는 아닙니다. CLR 자체에는 수많은 구조가 있으며 각 스레드에는 스택 등이 있습니다. 어쨌든 정확히 3GB를 사용할 수있을 것으로 기대할 수 없습니다.

3) BSOD는 드라이버 또는 커널 오류 때문입니다. AFAIK 응용 프로그램은 BSOD를 유발할 수 없으므로 관련이있을 가능성이 높습니다.

4) 많은 메모리를 사용하면 GC가 유지하는 데 어려움이 있습니다. GC의 특정 부분이 진행 중이며 사용자 스레드가 중단되면 응용 프로그램이 크게 느려집니다.

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