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



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

所以我想写成

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

。. NET是一个托管环境(即内存由它管理),此外还有线程——很难可靠地获得这些信息。

在某些情况下,您可以尝试使用GC.GetTotalAllocatedBytes进行一些大致估计(获取方法之前和之后的值并计算diff):

获取进程生命周期内分配的字节数。返回值不包括任何本地分配。

但是这只适用于单线程处理(或者如果应用程序只运行算法),并且不包括本机/非托管分配。此外,它不会考虑方法期间发生的任何GC(因此实际内存分配可能小于计算值)。

GC.GetAllocatedBytesForCurrentThread(如果算法是单线程的):

获取自当前线程生命周期开始以来分配给当前线程的总字节数。

GC.GetTotalMemory:

检索当前被认为已分配的字节数。参数表示该方法是否可以在返回前等待一段时间,以允许系统收集垃圾并完成对象。

另一种方法是研究分析你的应用程序(使用VS, dotTrace或dotnet monitor,以及其他工具,如dotnet gcdump)。再次强调,监控托管环境中实际消耗的内存并不是一件容易的事情(特别是与某些方法相关联),因此开发了这些工具。ClrMD也可以实现一些自动化。

最新更新