Подтвердить что ты не робот

Насколько плохо не распоряжаться() в Powershell?

Иногда нам приходится выполнять небольшие административные задачи в SharePoint. Простой PowerShell script - действительно хороший инструмент для этого. Например, такой script может перечислять обработчики событий из списка:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$site = new-object Microsoft.SharePoint.SPSite($args[0])   
$site.RootWeb.Lists["MyList"].EventReceivers > C:\MyListHandlers.txt

Известно, что объекты, такие как SPSite и SPWeb, должны быть Dispose() -d после вызова, в противном случае происходит утечка памяти. Лучше всего было бы позвонить

$site.RootWeb.dispose()
$site.dispose()

в конце этого script. Но если это Powershell script, который будет запускаться только один раз, и мы знаем, что PowerShell очищает после выполнения - неужели так плохо не вызывать dispose()?

Итак, мой вопрос: есть ли какая-то опасность, если иногда я запускаю скрипты вроде этого; повлияет ли она на общую стабильность фермы SharePoint (или сервера, на котором я запускаю script)?

4b9b3361

Ответ 1

Это было отредактировано, чтобы включить безопасный, неспецифический ответ.

В общем: уничтожить все, потому что Dispose - это способ .NET framework для освобождения внешних ресурсов (таких как дескрипторы файлов, порты TCP, подключения к базе данных и т.д.). Ресурсы не гарантируются, если вы не вызываете Dispose(). Так что будьте осторожны. Это общий ответ, отличный от SharePoint.

СПЕЦИАЛЬНО ПРИ СДЕЛЕНИИ С SharePoint: Когда вы закрываете процесс PowerShell.exe, память освобождается. Если вам нужно удалять объекты, чтобы поддерживать понижение давления памяти (важно в производственных средах или если вы перебираете все сайты/веб-сайты), убедитесь, что вы выбрали. Если нет, вам не нужно беспокоиться об утилизации.

Причина, по которой мы так безумно разбираемся в том, что в большинстве случаев код SharePoint работает в длительных процессах (как в рабочем процессе ASP.NET, так и в OWSTimer.exe) и не может быть утилизирован, для устранения неполадок, внезапных катастроф (т.е. бум веб-сервера). Эти катастрофические проблемы с производительностью /OutOfMemoryExceptions не влияют на меня большую часть времени при работе в PowerShell. Я запускаю ad-hoc-скрипты, я трачу ~ 3-50 МБ ОЗУ, потому что я не могу распоряжаться своими объектами, я закрываю окно PowerShell и память освобождается. Большую часть времени это непривязанный.

Я построил скрипты для работы с SharePoint, и большую часть времени я не беспокоюсь об утилизации.

Вот script, в котором я размещаю объекты SPSite и SPWeb

Вот script, в котором я не хочу распоряжаться объектом SPSite

Ответ 2

В идеале вы должны вызвать Dispose, когда это возможно. Даже внутри PowerShell.

Библиотеки SharePoint содержат много кода, который является всего лишь оберткой объектов COM, и чтобы сделать жизнь более увлекательной, многие из этих COM-объектов имеют свои собственные пулы и кеши. Вызов .NET для Dispose действительно просто инструктирует COM-объекты, что они могут освобождать свои собственные объекты (которые могут иметь срок службы вне вызывающего процесса).

Вот еще одна актуальная информация: http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx

Ответ 3

Просто следуйте this.

Даже если это простой script, который освобождает память после выполнения, вы никогда не знаете, будет ли в какой-то момент копироваться/вставляться во внутренний цикл более крупного script: -)

Для правильности вы всегда должны размещать объекты SP, указанные в ссылке выше.

Ответ 4

Если оболочка получает доступ к внешнему ресурсу, срок службы которого превышает срок службы PowerShell script, тогда он должен вызывать Dispose.

Однако, если это ресурс, выделенный script, то нет необходимости очищать. Когда выйдет script, вся память, выделенная для script, будет очищена.

Ответ 5

Закрытие процесса очистит все, будьте осторожны. Если вы должны были сделать цикл, включающий все сайты в вашей ферме, недостающее распоряжение может быстро съесть значительное количество памяти, что замедлит работу вашего сервера. Поскольку сценарии наиболее полезны для пакетных операций, всегда имейте это в виду.