Как плохо это не должно располагать () в Powershell?

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

[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()

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

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

33
задан naivists 2 February 2015 в 18:55
поделиться

5 ответов

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

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

SPECIFICALLY WHEN DEALING WITH SharePoint: Когда вы закрываете процесс PowerShell.exe, память освобождается. Если вам нужно утилизировать объекты, чтобы уменьшить нагрузку на память (что важно в производственных средах или если вы перепрыгиваете через все сайты/небесы), убедитесь, что вы утилизируете. Если нет, то вам не нужно беспокоиться об утилизации.

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

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

Вот скрипт, в котором я располагаю SPSite и SPWeb объекты

Вот скрипт, в котором я не утруждаюсь располагать SPSite объект

17
ответ дан 27 November 2019 в 19:30
поделиться

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

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

Вот более важная информация: http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx

4
ответ дан 27 November 2019 в 19:30
поделиться

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

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

2
ответ дан 27 November 2019 в 19:30
поделиться

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

2
ответ дан 27 November 2019 в 19:30
поделиться

Просто следуйте этому .

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

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

3
ответ дан 27 November 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: