我有一个用C#编写的应用程序运行良好,但偶尔在现场会出现错误,我们认为这些错误是由于内存条件不足或与垃圾收集器的交互造成的。
如果有人有兴趣,请在此处说明:
Unable to cast object of type 'NHibernate.Impl.ExpandedQueryExpression' to type 'NHibernate.Linq.NhLinqExpression'
我想尝试重现这个以进行调试,但我的开发机器有太多内存。
我删除了页面文件,因此我的虚拟内存仅限于12GB的物理内存,所以除了物理删除ram之外,是否有人对如何在开发环境中模拟低内存条件有任何建议?
修改
删除了询问监视垃圾收集器的工具?
答案 0 :(得分:5)
您可以使用虚拟机(VPC,VMWare或Virtual Box)并调低内存。
这比bug更可靠。
修改强>
此建议是一种模拟物理内存较少的PC的方法。正如评论和其他答案中所述,如果您希望调低虚拟内存“正在消失”,那么在流程开始时堆将是一个解决方案。
答案 1 :(得分:3)
您拥有的RAM量与Windows等虚拟内存操作系统无关。没有足够的只会减慢程序的速度。重要的是虚拟内存地址空间的大小,在32位操作系统上为2千兆字节。如果您有64位操作系统,请将EXE项目中的目标平台设置为x86。
您可以通过在程序开头调用Marshal.AllocHGlobal()来任意增加内存压力。分配一块,比如500兆字节。不会更多,这将很容易失败。通过分配90 MB块来获取更多信息。
答案 2 :(得分:3)
不是答案,而是我在The Code Project - Memory Allocation Tool
找到的非常酷的实用程序<强>简介强>
有时在极端情况下测试应用程序非常有帮助 资源不足,硬盘完全或内存不足。
这个工具只包括最后一个 - 记忆 它允许您分配尽可能多的内存。
答案 3 :(得分:2)
你可以:
Make Windows pretend it has less memory
Use AppVerifier (only mentioned here for completeness, only works for unmanaged code)
或者,如果您只想查看,只需monitor the collector。
答案 4 :(得分:0)
为什么不使用类似工具的错误?
答案 5 :(得分:0)
要监视垃圾收集器的活动和进程内存使用情况,可以使用Windows性能计数器。
要填充你的RAM,为什么不从c#程序中分配一个相当大的数组呢?
答案 6 :(得分:0)
您可以使用简单的C程序来分配或尝试在堆上分配任意数量的内存:
#include <stdio.h>
#include <stdlib.h>
#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;
}
答案 7 :(得分:0)
这是一个非常简单的程序,我们用它来测试Linux服务器上的低内存条件。我从未在Windows上编译它,但它应该可以工作。
https://github.com/julman99/eatmemory
我希望它适合你
答案 8 :(得分:0)
发现此实用程序现在是FreeWare:http://www.soft.tahionic.com/download-memalloc/