0

有没有办法仅使用托管代码在 C# 中获取剩余的空闲堆栈/堆内存?

具体来说,我不是指在当前分配状态下仍然可用的内存,而是指(将来)可以根据主机系统的主内存分配(如果需要)的所有内存。

该信息将用于对可用内存不足的系统采取措施,以防止系统内存不足。

4

2 回答 2

2

有一种称为 virtualquery 的方法可用于确定调用堆栈的大小。这里有一堆 C# 示例。

检查 C 中可用的堆栈大小

在 C# 中检查堆栈大小

对于大堆分配,您可以尝试 MemoryFailPoint 来检查分配是否可能并引发不同的异常,然后 OOM http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

于 2013-01-10T01:13:31.563 回答
1

答案主要由 AbdElRaheim 涵盖...关于 32 位系统的堆的附加说明。

如果您想一直检查堆分配的空间(顺便说一句,对于非 x64 程序有些有趣):您不仅需要可用内存总量,还需要所有区域的映射并查看已分配的内容。您要寻找的最有趣的信息是加载到您的地址空间中的 DLL——即使有 1GB 空闲并不意味着你可以分配 1GB 块——如果加载了一些随机的本机 DLL,GC 可能无法将多个块组合在一起在中间。

如果你想走得那么远——VirtualQuery是一个可能的起点。

于 2013-01-10T01:49:17.563 回答