2010-01-22 3 views
1

VM 사용에 대한 자세한 정보를 얻기위한 .NET API가 있습니까? 나는 구체적으로 나의 주소 공간이 어떻게 조각인지를 결정하는데 관심이있다.VM 조각화를 결정하기위한 .NET API

감사합니다.

답변

1

가상 메모리 섹션을 열거하고 사용되지 않는 공간을 검색하는 VirtualQueryEx(), GetProcessHeaps()를 사용하여 프로세스 내에 힙을 만들고 HeapWalk()를 다음과 같이 만드는 방법이 있습니다. 각 힙의 블록이 어떻게 사용되는지 알아보십시오.

이것은 쉽지는 않을 것입니다. 특히 HeapWalk()는 실행중인 프로그램에서 문제가있는 기능입니다. SysInternals의 VMMap utility을 살펴 봐야하는데, 뛰어난 가상 메모리 진단 기능을 제공합니다.

이 결함은 실제로 메모리 조각화 문제를 해결하는 데 도움이되지 않는다는 것입니다. Windows 메모리 관리자가 가상 ​​메모리 공간을 하위 할당하는 방식에 영향을 줄 수있는 방법은 없습니다. 메모리를 할당하지 않을 경우 부족합니다. 이제 OOM에 어려움을 겪고 있다면 앱 재구성을 고려해야합니다. 또는 64 비트 운영 체제로 전환하면 200 달러짜리 솔루션이됩니다.

+0

VMMap 앱은 멋지다. 감사!! – Chris

1

짧은 대답 : 아니오. 이를 위해 Win32 API를 활용해야합니다.

[DllImport("coredll.dll", SetLastError=true)] 
static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer); 

을하지만 MEMORYSTATUS 구조체가 모든 정보를 가지고하지 않는 것 : 정말

http://www.pinvoke.net에 빠른 검색이를 알려준 ... API는하지만 사용하는 것이 전화를 모르겠어요 당신은 (단지 물리적 인 메모리 & 가상 메모리 사용 및 기타 정보) 필요합니다.

MSDN에서 필요한 방법을 찾아야합니다.

0

다른 CLR 호스트가 일반 응용 프로그램 호스트 나 SQL Server와 같이 다른 작업을 처리 할 수 ​​있으므로 이러한 호출은 관리되는 영역에서 의미가 없습니다. 그리고 GC가 모든 것을 움직일 수 있다는 것을 잊지 마십시오. 조각화가 실제로 문제가되지 않도록 GC가 힙을 압축합니다.

그러나 다음 단계로 넘어 가면 CLR을 직접 호스팅하여이 정보를 얻을 수 있습니다. this blog post about this topic을보고 싶을 수 있습니다.

0

페이지 수준에서이 정보를 얻으려면 실제로 Win32/Win64 API를 사용해야합니다. 더 자세히 설명하면 C 힙, Win32 힙, CLR 작은 개체 힙 또는 CLR 대형 개체 힙 중 어느 것이 든보고있는 힙의 내부 동작을 알아야합니다.

Virtual Memory Validator (상업용이지만 무료)을 사용하여 가상 메모리 공간을 시각화하고 단락별로 메모리 공간을 페이지별로 검토 할 수 있습니다. 일반적인 문제와 추세를 쉽게 볼 수 있으므로 먼저 시각을 살펴보십시오. 그런 다음 문제가되는 메모리 영역을 결정할 때 페이지와 단락에 대한 자세한 정보를보십시오.

여기에 pages and paragraphs이 무엇인지 설명하는 블로그 기사가 있습니다.

0
C에서

당신이 할당 된 메모리 양을 알고 이런 식으로 뭔가를 쓸 수 있습니다 : 당신이 통과하는 두 번째 루프를 필요로하는 경우 다른 힙이에 사용하는 경우 필요할 수 있습니다)

HANDLE heap = GetProcessHeap(); 
PROCESS_HEAP_ENTRY entry; 
memset(&entry, 0, sizeof(entry)); 
unsigned long size = 0; 
while(HeapWalk(heap, &entry)) { 
    if(entry.wFlags & PROCESS_HEAP_ENTRY_BUSY) { 
     size += entry.cbData; 
    } 
} 

GetProcessHeaps을 (모든 힙.나는 왜 그들이 하나 이상이 될지 모르겠다.

귀하의 경우 블록 수와 크기를 계산해야합니다. 이를 디스크에 저장하려면 먼저 블록 수를 세고 버퍼를 할당하여 모든 정보를 저장 한 다음 버퍼를 파일로 저장하여 나중에 검토하십시오.