有用于获取关于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来获取这些信息。你可能想看看这个博客帖子这个话题

您真的要趴下到的Win32 / Win64的API来获取在页面级别这一信息。任何更详细和你需要知道的内部工作的任何一个堆你正在寻找,无论是其一个C堆,Win32堆,一个CLR小对象堆或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。我不知道为什么他们会不止一个,但。

在你的情况,你可能应该算块及其大小的数量。如果你想保存到磁盘上,我建议你先算块的数量,分配一个缓冲区来保存所有的信息,然后保存以供日后审查文件的缓冲区。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top