web-dev-qa-db-fra.com

Quelle est la peine de ne pas disposer () dans PowerShell?

Parfois, nous devons effectuer de petites tâches administratives dans SharePoint. Un script de PowerShell simple est un très bon outil pour cela. Par exemple, ce script peut énumérer des gestionnaires d'événements d'une liste:

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

Il est connu que des objets comme SPSite et SPWeb doivent être Dispose()- D après un appel, sinon des fuites de mémoire se produisent. Le meilleur serait d'appeler

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

à la fin de ce script. Mais s'il s'agit d'un script PowerShell qui ne sera exécuté qu'une seule fois, et nous savons que PowerShell se nettoie après l'exécution - est-il si mauvais de ne pas appeler ()?

Donc, ma question est - y a-t-il un danger si parfois je fais des scripts comme celui-ci; Cela affectera-t-il la stabilité globale de SharePoint Farm (ou du serveur sur lequel je suis en cours d'exécution)?

33
naivists

Cela a été édité pour inclure une réponse sûre et non spécifique.

En général: Disposez tout, car vous éliminez la méthode de la structure .NET pour libérer des ressources externes (telles que les poignées de fichier, les ports TCP, les connexions de base de données, etc.). Les ressources ne sont pas garanties à être publiées à moins que vous appeliez disposer (). Alors méfiez-vous. C'est la réponse générale non-SharePoint.

Spécifiquement lors de la gestion de SharePoint: Lorsque vous fermez le processus PowerShell.exe, la mémoire est libérée. Si vous avez besoin de disposer d'objets pour réduire la pression de la mémoire (Important dans les environnements de production ou si vous vous en bouchon sur tous les sites/Web), assurez-vous de disposer. Sinon, vous n'avez pas besoin de vous soucier de disposer.

La raison pour laquelle nous sommes si fous de disposer en premier lieu est que la plupart du code SharePoint s'exécute dans des processus de longue date (soit dans un processus de travailleur ASP.NET, soit Owstimer.exe) et owstimer.exe) et omis de disposer peut causer des problèmes difficiles à dépanner. , des catastrophes soudaines (c'est-à-dire que le serveur Web Go Boom). Ces problèmes de performance catastrophiques/exceptionnels exceptionnels ne me concernent pas la plupart du temps lorsque vous travaillez dans PowerShell. Je gère des scripts ad-hoc, je gaspille ~ 3-50 Mo de RAM Parce que je ne parviens pas à disposer de mes objets, je ferme la fenêtre PowerShell et la mémoire est libérée. la plupart du temps c'est une non -issant.

J'ai construit des scripts pour travailler avec SharePoint et la plupart du temps, je ne m'engage pas.

Voici un script dans lequel je dispose des objets SPSITE et SPWEB

Voici un script dans lequel je ne me préoccupe pas de disposer d'un objet spsite

17
Peter Seale

Idéalement, vous devez appeler lorsque cela est possible. Même à l'intérieur de PowerShell.

Les bibliothèques SharePoint incluent beaucoup de code qui est juste une enveloppe autour des objets COM - et de rendre la vie plus amusante, beaucoup de ces objets com ont leurs propres piscines et caches. L'appel .NET pour éliminer n'indique vraiment que les objets COM qu'ils peuvent libérer leurs propres objets (pouvant avoir une durée de vie en dehors du processus d'appel).

Voici quelques informations plus pertinentes: http://blogs.msdn.com/sharepoint/archive/2009/02/11/SharePoint-and-powershell-knowledge.aspx

4
Goyuix

En fermant le processus, faites attention. Si vous deviez faire une boucle impliquant tous les sites de votre ferme, un dispositif manquant peut rapidement manger des quantités significatives de mémoire qui ralentiseront votre serveur à une rampe. Puisque le script est le plus utile pour les opérations de lot, gardez toujours cela à l'esprit.

2
James

Si la coquille accède à une ressource externe qui a une durée de vie plus longue que la durée de vie du script PowerShell, elle devrait alors appeler.

Toutefois, s'il s'agit d'une ressource allouée par le script, il n'est pas nécessaire de nettoyer. Lorsque le script sort, toute la mémoire allouée pour le script sera nettoyée.

2
Larry Watanabe