所以我有一个接口函数,对我来说是一个黑盒子,我需要测试。它只在托管代码中起作用。我对内存大小有算法限制。我想控制在调用<= X
期间,内存的峰值消耗量。换句话说,我想限制或控制在给定范围内的总可分配空间,以及如果我们超过了这个限制抛出。如何在.Net中做这样的事情?
所以我想要这样的东西
wrapper.setMemLimit = 1000; // in bytes
try {
wrapper.run(methodToTest());
} catch (Exception e) {
// hit mem cap limit during execution!
}
1条答案
按热度按时间zlwx9yxi1#
.NET是一个托管环境(即内存由它管理),此外还有线程-很难可靠地获得这些信息。
在某些情况下,您可以尝试使用
GC.GetTotalAllocatedBytes
进行一些近似估计(获取方法前后的值并计算diff):获取在进程生存期内分配的字节数。返回值不包括任何本机分配。
但这只适用于单线程处理(或者应用程序只运行算法),并且引用的内容不包括本机/非托管分配,也不考虑方法执行期间发生的任何GC(因此实际内存分配可能小于计算值)。
或
GC.GetAllocatedBytesForCurrentThread
(如果算法是单线程的):获取自当前线程的生存期开始以来分配给该线程的字节总数。
或者
GC.GetTotalMemory
:检索当前认为要分配的字节数。一个参数指示此方法是否可以在返回前等待一个短时间间隔,以允许系统收集垃圾并完成对象。
另一种方法是分析应用程序(with VS、dotTrace或使用
dotnet monitor
和其他工具,如dotnet gcdump
)。同样,在托管环境中监视实际消耗的内存并不是一件容易的任务(特别是与某些方法绑定),因此开发了这些工具。使用ClrMD也可以实现一些自动化。