VM 사용에 대한 자세한 정보를 얻기위한 .NET API가 있습니까? 나는 구체적으로 나의 주소 공간이 어떻게 조각인지를 결정하는데 관심이있다.VM 조각화를 결정하기위한 .NET API
감사합니다.
VM 사용에 대한 자세한 정보를 얻기위한 .NET API가 있습니까? 나는 구체적으로 나의 주소 공간이 어떻게 조각인지를 결정하는데 관심이있다.VM 조각화를 결정하기위한 .NET API
감사합니다.
가상 메모리 섹션을 열거하고 사용되지 않는 공간을 검색하는 VirtualQueryEx(), GetProcessHeaps()를 사용하여 프로세스 내에 힙을 만들고 HeapWalk()를 다음과 같이 만드는 방법이 있습니다. 각 힙의 블록이 어떻게 사용되는지 알아보십시오.
이것은 쉽지는 않을 것입니다. 특히 HeapWalk()는 실행중인 프로그램에서 문제가있는 기능입니다. SysInternals의 VMMap utility을 살펴 봐야하는데, 뛰어난 가상 메모리 진단 기능을 제공합니다.
이 결함은 실제로 메모리 조각화 문제를 해결하는 데 도움이되지 않는다는 것입니다. Windows 메모리 관리자가 가상 메모리 공간을 하위 할당하는 방식에 영향을 줄 수있는 방법은 없습니다. 메모리를 할당하지 않을 경우 부족합니다. 이제 OOM에 어려움을 겪고 있다면 앱 재구성을 고려해야합니다. 또는 64 비트 운영 체제로 전환하면 200 달러짜리 솔루션이됩니다.
짧은 대답 : 아니오. 이를 위해 Win32 API를 활용해야합니다.
[DllImport("coredll.dll", SetLastError=true)]
static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
을하지만 MEMORYSTATUS 구조체가 모든 정보를 가지고하지 않는 것 : 정말
이 http://www.pinvoke.net에 빠른 검색이를 알려준 ... API는하지만 사용하는 것이 전화를 모르겠어요 당신은 (단지 물리적 인 메모리 & 가상 메모리 사용 및 기타 정보) 필요합니다.
MSDN에서 필요한 방법을 찾아야합니다.
다른 CLR 호스트가 일반 응용 프로그램 호스트 나 SQL Server와 같이 다른 작업을 처리 할 수 있으므로 이러한 호출은 관리되는 영역에서 의미가 없습니다. 그리고 GC가 모든 것을 움직일 수 있다는 것을 잊지 마십시오. 조각화가 실제로 문제가되지 않도록 GC가 힙을 압축합니다.
그러나 다음 단계로 넘어 가면 CLR을 직접 호스팅하여이 정보를 얻을 수 있습니다. this blog post about this topic을보고 싶을 수 있습니다.
페이지 수준에서이 정보를 얻으려면 실제로 Win32/Win64 API를 사용해야합니다. 더 자세히 설명하면 C 힙, Win32 힙, CLR 작은 개체 힙 또는 CLR 대형 개체 힙 중 어느 것이 든보고있는 힙의 내부 동작을 알아야합니다.
Virtual Memory Validator (상업용이지만 무료)을 사용하여 가상 메모리 공간을 시각화하고 단락별로 메모리 공간을 페이지별로 검토 할 수 있습니다. 일반적인 문제와 추세를 쉽게 볼 수 있으므로 먼저 시각을 살펴보십시오. 그런 다음 문제가되는 메모리 영역을 결정할 때 페이지와 단락에 대한 자세한 정보를보십시오.
여기에 pages and paragraphs이 무엇인지 설명하는 블로그 기사가 있습니다.
당신이 할당 된 메모리 양을 알고 이런 식으로 뭔가를 쓸 수 있습니다 : 당신이 통과하는 두 번째 루프를 필요로하는 경우 다른 힙이에 사용하는 경우 필요할 수 있습니다)
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을 (모든 힙.나는 왜 그들이 하나 이상이 될지 모르겠다.
귀하의 경우 블록 수와 크기를 계산해야합니다. 이를 디스크에 저장하려면 먼저 블록 수를 세고 버퍼를 할당하여 모든 정보를 저장 한 다음 버퍼를 파일로 저장하여 나중에 검토하십시오.
VMMap 앱은 멋지다. 감사!! – Chris