所以我有一个接口函数,对我来说是一个黑盒,我需要测试。它仅在托管代码中起作用。我对内存大小有算法限制。我想控制在调用<= 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也可以实现一些自动化。