Иногда, перестраивая свое решение, я получаю следующую ошибку. Решение огромно, более 270 проектов, и я не знаю, как избавиться от этой ошибки. Это иногда случается, в большинстве случаев решение строится правильно. У меня 32 ГБ ОЗУ, так что это не проблема, у меня также есть ReSharper, у друга на работе его нет, и я никогда не сталкивался с ошибкой, поэтому, возможно, есть проблема. В любом случае, если у кого-нибудь есть идея, как его починить, я был бы очень рад это услышать;)

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\SSDT\Microsoft.Data.Инструменты.Схема.SqlTasks.targets (559,5): Ошибка: MSB4018: задача "SqlBuildTask" неожиданно завершилась неудачно. 31> Microsoft.Data.Инструменты.Схема.Sql.Построить.BuildFailedException: исключение типа 'System.OutOfMemoryException 'было брошено. ---> Система.OutOfMemoryException: исключение типа 'System.OutOfMemoryException 'было брошено.

1 ответ1

0

Это похоже на известную проблему в
Неограниченные экземпляры / соединения SQLite, способствующие сбоям OOM # 22650.

Эта проблема, по-видимому, была решена в Visual Studio 2017 версии 15.5, и исправление могло быть перенесено в 15.4.

Обновление Visual Studio 2017 до последней версии должно решить проблему (если она действительно такая же).


Поскольку это не решило проблему, стоит отметить, что ошибка OutOfMemoryException не означает нехватку памяти, а скорее невозможность выделения памяти. Я объясню ниже, почему это не одно и то же.

Поскольку Visual Studio является 32-разрядной программой, объем ее памяти ограничен 4 ГБ. Исходя из этого, он может "только" использовать около 2 ГБ для своих данных, остальное используется программным обеспечением Windows и для программ. В этом пространстве физической памяти выделяются виртуальные адреса, поэтому некоторые адреса уже распределены, а некоторые нет. Механизм сбора мусора невозможен, поэтому выделенный адрес остается выделенным.

Представьте, например, что из 2 ГБ, которые доступны, выделено 100 МБ, и каждый хочет выделить еще 1 ГБ. Логично, что доступной памяти гораздо больше, чем достаточно. Однако, если 100 МБ выделены в середине пространства 2 ГБ, больше невозможно выделить 1 ГБ непрерывной памяти. В этом случае условие OutOfMemoryException будет повышено, хотя это выглядит абсолютно невозможным.

Этот случай может возникать, когда память выделяется и освобождается таким образом, что выделенные фрагменты памяти рассеиваются по доступному адресному пространству и оставляют только "дыры", которых недостаточно для большого выделения.

Поэтому есть только две возможности:

  1. Исправлена ошибка в Visual Studio, как, например , при попытке увеличить длину экземпляра класса StringBuilder за то , что определяется его текущей собственности MaxCapacity также вызывает состояние OutOfMemoryException.

  2. Слишком много выделений сделано, поэтому даже освобожденная память слишком фрагментирована.

Кажется, ваш случай лучше подходит для второго случая, но ваши варианты решения здесь довольно ограничены.

64-разрядная версия Visual Studio могла бы решить эту проблему путем увеличения адресного пространства, но это не входит в дорожную карту Visual Studio.

Другой вариант - максимально сократить выделение памяти. Вы можете уменьшить количество надстроек Visual Studio или попробовать разбить это огромное решение VS на более мелкие. Или вы можете закрыть и перезапустить Visual Studio, так как некоторые выделения памяти выполняются параллельно потоками Visual Studio, так что здесь задействован случайный элемент.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .