我在我的应用程序中遇到了一个非常奇怪的行为,导致OutOfMemoryException。我在这件事上发现的其他几篇文章中找不到任何线索(例如,1,2,3)。
我的应用程序编译为64位,我的系统有16GB内存,在进行以下测试时,我总是有大约8-10GB的可用内存。
我有一个这个应用程序的版本(A)完美运行,并定期分配总共5GB的数据。然后在最近几周我开始研究新版本(B)。当我尝试运行或调试版本B时,每次我的进程(或主机1)大约超过2GB时,我都会一直得到OutOfMemoryException。
请注意,我没有使用大于2GB的单个对象(即使我已尝试在app.config中包含gcAllowVeryLargeObjects
)。
内存使用方面最显着的差异是版本B连续分配了大量的List []数组(这里是我获得异常的地方)。更确切地说:
List<T>[] lists = new List<T>[N];
for (int i = 0; i < n; i++)
lists [i] = new List<T>(S);
使用:
N=16k
S~=20k
typeof(T)=Int64
这意味着我分配了大约16k个阵列,每个阵列160KB(总计2.5GB内存)。所以最初我认为问题可能是内存碎片,并且不可能找到16k的每个160KB连续内存的漏洞。但对我来说根本不清楚的是,在任务管理器上当仍然有6GB或更多的可用内存时,我的进程永远不会超过2GB 。可以将内存如此支离破碎?有人可以解释一下吗?
更新
我找到了另一块ram,现在我的系统有20GB。我不再有问题了。我的进程占用的总内存为4GB。我仍然不明白我之前观察到的是16GB安装内存并且我的进程不超过2GB ...
更新2
我回到了16GB的ram,我没有OutOfMemoryException。我不认为安装的内存是问题。在安装内存之间我进入了Project&gt;构建属性以检查目标平台(请参阅Hans Passant的评论)。我验证平台是x64,我从来没有改变过这个。我有一种感觉,VS出于某种原因或错误而攻击32位,并且通过进入设置,现在正确定位了正确的平台。所有的故事对我来说仍然模糊不清,但这是我唯一可以猜到的。