【问题标题】:How to obtain remaining free stack / heap memory in C# using managed code?如何使用托管代码在 C# 中获取剩余的可用堆栈/堆内存?
【发布时间】:2012-12-24 07:36:18
【问题描述】:

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

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

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

【问题讨论】:

  • 回答“我要多久才能到达 OOME?”将根据您尝试进行的分配大小而有所不同。内存保留在连续的块中,这意味着您可能只能保留比可用总数少得多的内存,尤其是在分配大型数组或类似的情况下。
  • 感谢您指出这一点!为了让我的问题更清楚:我只需要一个粗略的可用内存近似值,例如确定 300MB 的内存是否仍然可用(大约 100MB 的精度就足够了)。
  • 旁注:取决于您是否对连续块感兴趣,您可能需要做的不仅仅是可用空间的大小(请参阅我的回答)。

标签: c# xna


【解决方案1】:

有一个叫做 virtualquery 的方法可以用来确定调用栈的大小。这里有一堆 C# 示例。

Checking available stack size in C

Checking stack size in C#

对于大堆分配,您可以尝试 MemoryFailPoint,它检查是否可以分配并抛出与 OOM 不同的异常 http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 2012-01-12
      • 2017-12-23
      • 1970-01-01
      • 2020-10-10
      • 2013-02-07
      相关资源
      最近更新 更多