.net 是否可以检查调用期间分配的内存是否小于X

r3i60tvu  于 2023-01-06  发布在  .NET
关注(0)|答案(1)|浏览(113)

所以我有一个接口函数,对我来说是一个黑盒子,我需要测试。它只在托管代码中起作用。我对内存大小有算法限制。我想控制在调用<= X期间,内存的峰值消耗量。换句话说,我想限制或控制在给定范围内的总可分配空间,以及如果我们超过了这个限制抛出。如何在.Net中做这样的事情?
所以我想要这样的东西

wrapper.setMemLimit = 1000; // in bytes
try { 
 wrapper.run(methodToTest());
} catch (Exception e) {
 // hit mem cap limit during execution!
}
zlwx9yxi

zlwx9yxi1#

.NET是一个托管环境(即内存由它管理),此外还有线程-很难可靠地获得这些信息。
在某些情况下,您可以尝试使用GC.GetTotalAllocatedBytes进行一些近似估计(获取方法前后的值并计算diff):
获取在进程生存期内分配的字节数。返回值不包括任何本机分配。
但这只适用于单线程处理(或者应用程序只运行算法),并且引用的内容不包括本机/非托管分配,也不考虑方法执行期间发生的任何GC(因此实际内存分配可能小于计算值)。
GC.GetAllocatedBytesForCurrentThread(如果算法是单线程的):
获取自当前线程的生存期开始以来分配给该线程的字节总数。
或者GC.GetTotalMemory
检索当前认为要分配的字节数。一个参数指示此方法是否可以在返回前等待一个短时间间隔,以允许系统收集垃圾并完成对象。
另一种方法是分析应用程序(with VSdotTrace或使用dotnet monitor和其他工具,如dotnet gcdump)。同样,在托管环境中监视实际消耗的内存并不是一件容易的任务(特别是与某些方法绑定),因此开发了这些工具。使用ClrMD也可以实现一些自动化。

相关问题