题
有用于获取关于VM使用的详细信息需要.NET API?我特别感兴趣的是如何确定碎片我的地址空间。
谢谢!
解决方案
那种Windows API函数,可以给你在这一些见解是VirtualQueryEx()来枚举虚拟内存部分,并发现未使用的空间,GetProcessHeaps()来查找堆的过程中创建和HeapWalk()来发现如何在各堆块被使用。
这是不会容易,特别HeapWalk()处于运行程序的麻烦的功能。你应该看看的Sysinternals的的VMMap实用,它提供了极好的虚拟存储器诊断程序。
这样做的垮台是,它并没有真正帮助您解决了内存碎片问题。没有什么可以做,以影响Windows内存管理子分配的虚拟内存空间的方式。从短期不分配内存。如果你现在用OOM挣扎,你真的应该考虑重新架构你的应用程序。或切换到64位操作系统,200美元的解决方案。
其他提示
短的答案:没有。你需要点击进入Win32 API中了点。我真的不知道你会用什么API调用,虽然...
在 http://www.pinvoke.net 快速搜索使我这个:
[DllImport("coredll.dll", SetLastError=true)]
static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
但MEMORYSTATUS结构似乎并不具备所有的信息你需要(只是物理和虚拟内存使用情况等信息)。
您应该挖过来MSDN找到必要的方法。
这样的调用不会在管理世界意义,因为不同的CLR主机可以处理事物的不同(如正常的应用程序主机或SQL Server)。而且不要忘记,GC可以移动的东西,使碎片是不是一个真正的问题是GC压缩堆。
然而,这使我想到下一个点,你应该能够通过托管自己CLR来获取这些信息。你可能想看看这个博客帖子这个话题一>
在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。我不知道为什么他们会不止一个,但。
在你的情况,你可能应该算块及其大小的数量。如果你想保存到磁盘上,我建议你先算块的数量,分配一个缓冲区来保存所有的信息,然后保存以供日后审查文件的缓冲区。