如何使用托管代码在C#中获得剩余的可用堆栈/堆内存?

如何使用托管代码在C#中获得剩余的可用堆栈/堆内存?,c#,xna,C#,Xna,是否有办法仅使用托管代码获得C#中剩余的可用堆栈/堆内存 具体来说,我不是指在当前已分配状态下仍然可用的内存,而是指(将来)可以根据主机系统的主内存分配(如果需要)的所有内存 这些信息将用于在可用内存不足的系统上采取措施,以防止系统内存不足。有一种称为virtualquery的方法,可用于确定调用堆栈的大小。这里有很多C#示例 对于大堆分配,您可以尝试MemoryFailPoint,它检查分配是否可行,然后抛出不同的异常 有一种称为virtualquery的方法,可用于确定调用堆栈的大小。这

是否有办法仅使用托管代码获得C#中剩余的可用堆栈/堆内存

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


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

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

对于大堆分配,您可以尝试MemoryFailPoint,它检查分配是否可行,然后抛出不同的异常

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

对于大堆分配,您可以尝试MemoryFailPoint,它检查分配是否可行,然后抛出不同的异常

答案主要由阿布德拉赫姆回答。。。关于32位系统堆的附加说明

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

答案主要由阿卜杜拉海姆介绍。。。关于32位系统堆的附加说明

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

关于“我要多久才能到达OOME?”的答案将根据你尝试分配的大小而有所不同。内存是在连续块中保留的,这意味着您可能只能保留比可用内存总量少得多的内存,特别是在分配大型阵列或类似阵列时。感谢您指出这一点!为了让我的问题更清楚:我只需要一个大致的可用内存近似值,例如,确定300MB的内存是否仍然可用(大约100MB的精度就足够了)。旁注:根据您是否对连续块感兴趣,您可能需要做的不仅仅是可用空间的大小(请参阅我的答案)。的答案是“离我撞上OOME还有多久?“将根据您尝试分配的大小而有所不同。内存是在连续块中保留的,这意味着您可能只能保留比可用内存总量少得多的内存,特别是在分配大型阵列或类似阵列时。感谢您指出这一点!为了让我的问题更清楚:我只需要一个大致的可用内存近似值,例如,确定300MB的内存是否仍然可用(精度~100MB就足够了)。旁注:根据您是否对连续块感兴趣,您可能需要做的不仅仅是可用空间的大小(请参阅我的答案)。