我在上周五离开工作之前运行了一些代码,我周一在这里,它以OutOfMemoryException停止.我估计整个过程需要进行数百亿次计算,所以这不是一项小任务.
我甚至不知道如何解决这个问题.
有什么指针吗?
最简单,最直接的解决方案是:
procdump(包含在Sysinternals Suite中)在进程达到一些不合理的大小时进行完整的内存转储..loadby sos clr!dumpheap -stat以查看哪种类型的对象占用了大部分内存.!dumpheap -type <MY_TYPE>!gcroot <OBJ_ADDRESS>.输出应该告诉您哪个对象仍然包含对它的引用,以及为什么不释放该对象.如果您怀疑泄漏的来源是一些原生代码,你可以通过发出以下命令来验证这一点:!eeheap -gc.输出将告诉您托管堆占用多少内存.如果你的进程的私有工作集大小远远大于托管堆的大小,那么你可能手上有本机泄漏(或者,也许是因为某种原因你产生了很多线程,所以你是由于线程的堆栈而耗尽空间[你可以通过发出这个命令检查你的进程中产生了多少线程:~*或者:!threads只显示被管理的线程].