MSB4018:“SqlBuildTask”任务意外失败 ==> System.OutOfMemoryException

MSB4018:“SqlBuildTask”任务意外失败 ==> System.OutOfMemoryException

有时,重建解决方案时会出现以下错误。解决方案非常庞大,有 270 多个项目,我不知道如何摆脱这个错误。有时会发生这种情况,但大多数情况下解决方案都能正确构建。我有 32GB RAM,所以这不是问题,我还有一个 ReSharper,工作中的朋友没有它,也从未遇到过此错误,所以可能存在问题。无论如何,如果有人知道如何修复它,我会非常高兴听到它 ;)

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\SSDT\Microsoft.Data.Tools.Schema.SqlTask​​s.targets(559,5): 错误:MSB4018:“SqlBuildTask”任务意外失败。31>Microsoft.Data.Tools.Schema.Sql.Build.BuildFailedException:引发了类型为“System.OutOfMemoryException”的异常。---> System.OutOfMemoryException:引发了类型为“System.OutOfMemoryException”的异常。

答案1

这似乎是
不受限制的 SQLite 实例/连接导致 OOM 故障 #22650

该问题显然已在 Visual Studio 2017 版本 15.5 中得到解决,并且修复可能已移植到 15.4 版本。

将 Visual Studio 2017 更新到最新版本应该可以解决问题(如果确实相同)。


由于这并没有解决问题,值得注意的是,OutOfMemoryException 错误并不意味着内存不足,而是无法分配记忆。下面我会解释为什么这些不一样。

由于 Visual Studio 是 32 位程序,因此其内存空间限制为 4 GB。因此,它“仅”可以使用大约 2 GB 来存储数据,其余部分由 Windows 软件和程序使用。物理内存在此空间中分配虚拟地址,因此某些地址已分配,而某些地址尚未分配。没有可能的垃圾回收机制,因此地址一旦分配,就会保持分配状态。

例如,假设在可用的 2 GB 中分配了 100 MB,并且有人想分配额外的 1 GB。从逻辑上讲,可用内存远远绰绰有余。但是,如果在 2 GB 空间的中间分配了 100 MB,则不再可能分配 1 GB连续的内存。在这种情况下,将引发 OutOfMemoryException 情况,尽管这看起来根本不可能。

当内存的分配和释放方式使得分配的内存片段分散在可用的地址空间中并且仅留下不足以进行大量分配的“漏洞”时,就会出现这种情况。

因此,只有两种可能:

  1. Visual Studio 中的错误(例如当尝试将类实例的长度增加到StringBuilder超出其当前属性指定的范围时MaxCapacity)也会导致 OutOfMemoryException 情况。

  2. 分配过多,因此即使释放,内存也会过于碎片化。

您的案例似乎更适合第二种情况,但此处解决方案的选择非常有限。

64 位版本的 Visual Studio 可以通过扩大地址空间来解决这个问题,但这并不是 Visual Studio 路线图

另一个选择是尽可能减少内存分配。您可以减少 Visual Studio 的附加组件数量,或者尝试将这个庞大的 VS 解决方案拆分成几个较小的解决方案。或者您可以关闭并重新启动 Visual Studio,因为一些内存分配是由 Visual Studio 线程并行完成的,因此其中涉及随机元素。

相关内容