可执行但不是调试模式(或通过VS运行的发布模式)内存不足异常

时间:2018-03-16 19:41:18

标签: vb.net visual-studio-2013 out-of-memory

我在VB.NET中运行程序,使用VS 2013,采用64位架构,并启用了allowverylargeobjects。

我有一个类的对象列表。该类具有各种属性,即数据,类似

Class cMyClass
Property desc1 as String
Property desc2 as String
Property value as Double
End Class

我通过从SQL服务器读取来填充此列表。我可以在调试或释放模式下成功地在列表中放置这个类的1亿个对象,并对它们进行操作就好了。但有一次,我在列表中填充了1.5亿个对象。当我在调试模式下(或者甚至在发布模式下,但通过VS)通过Visual Studio运行程序时,我没有问题用1.5亿个对象填充列表。但是当我使用一个可执行文件(从发布模式编译)时,它会抛出一个错误(错误框告诉我它在一个特定的子程序中,唯一发生的事情就是填充这个列表) - " exceededSystem .OutOfMemoryException:数组维度超出了支持的范围。"

我认为将这么多内容加载到内存中是不好的做法,但我已经走了很远的路,只需要解决一次。通过VS运行程序,我可以清楚地解决它,但是想了解为什么这在VS(在调试模式或发布模式下)适用于我,但在运行可执行文件时却不行。

我补充一点,我不认为这是一个硬件问题。该程序在运行时使用超过20GB的内存,但它运行在128GB RAM的盒子上。

谢谢。

1 个答案:

答案 0 :(得分:0)

在exe.config文件(https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element)中启用gcAllowVeryLargeObjects

即使处于活动状态,元素数量仍然受到限制:

  • 多维数组中的4,294,967,295
  • 一维数组中的2,146,435,071
  • 单字节数组为2,147,483,591

请注意,正如Tycobb的评论所述,gcAllowVeryLargeObjects在对象级别而不是在进程级别工作-因此您的进程可能使用20 gb的RAM,这些RAM由许多<2 GB的对象之和构成。