如何在Windows 7中模拟低内存条件
我有一个用C#编写的应用程序运行良好,但偶尔会在现场发出错误,我们认为这些错误是由于内存条件不足或与垃圾收集器的交互造成的。
如果有人有兴趣,这里描述:
无法将类型为’NHibernate.Impl.ExpandedQueryExpression’的对象强制转换为’NHibernate.Linq.NhLinqExpression’
我想尝试重现这个以进行调试,但我的开发机器有太多的内存。
我删除了页面文件,因此我的虚拟内存仅限于12GB的物理内存,所以除了物理删除ram之外,是否有人对如何在开发环境中模拟低内存条件有任何建议?
编辑:
删除了询问监视垃圾收集器的工具?
您可以使用虚拟机(VPC,VMWare或Virtual Box)并调低内存。
这比bug更可靠。
编辑
这个建议是一种模拟物理内存较少的PC的方法。 正如评论和其他答案中所述,如果您希望调低虚拟内存“正在消失”,那么在流程开始时堆将是一个解决方案。
您拥有的RAM量与Windows等虚拟内存操作系统无关。 没有足够的只会减慢程序的速度。 重要的是虚拟内存地址空间的大小,32位操作系统上的2千兆字节。 如果您有64位操作系统,请将EXE项目中的目标平台设置为x86。
您可以通过在程序开始时调用Marshal.AllocHGlobal()来任意增加内存压力。 分配一块,比如500兆字节。 不会更多,这将很容易失败。 通过分配90 MB块来获取更多内容。
不是答案,而是我在The Code Project – Memory Allocation Tool中找到的一个非常酷的实用工具
介绍
有时,在极端情况下测试应用程序非常有用
资源不足,硬盘完全或内存不足。
这个工具只包含最后一个 – 内存。
它允许您分配尽可能多的内存。
您可以:
让Windows假装它有更少的内存 。
使用AppVerifier(此处仅提及完整性,仅适用于非托管代码)
或者,如果您只是想看,只需监控收集器 。
为什么不使用像工具这样的bug?
要监视垃圾收集器的活动和进程内存使用情况,可以使用Windows性能计数器。
为了填补你的内存,为什么不从ac#program分配一个相当大的数组呢?
您可以使用简单的C程序来分配或尝试在堆上分配任意数量的内存:
#include #include #define MB (1024*1024) #define DEFAULT_ALLOC ((size_t) (512*MB)); int main(int argc, char *argv[]) { char buffer[2]; char *chunk; char *endp; size_t howmuch; if ( argc < 2 ) { howmuch = DEFAULT_ALLOC; } else { howmuch = strtoul(argv[1], &endp, 10); if ( *endp ) { fputs("Failed to parse command line argument", stderr); howmuch = DEFAULT_ALLOC; } else { howmuch *= MB; } } chunk = calloc(howmuch, 1); if ( chunk == NULL ) { fputs("Memory allocation error", stderr); exit(EXIT_FAILURE); } puts("Memory allocated.\nPress ENTER to terminate program"); fgets(buffer, 2, stdin); return EXIT_SUCCESS; }
这是一个非常简单的程序,我们用它来测试Linux服务器上的低内存条件。 我从来没有在Windows上编译它,但它应该工作。
https://github.com/julman99/eatmemory
我希望这个对你有用
找到此实用程序,现在是FreeWare: http : //www.soft.tahionic.com/download-memalloc/