À quel point est-il mauvais de ne pas disposer () dans Powershell?

Parfois, nous devons effectuer de petites tâches administratives dans SharePoint. Un script PowerShell simple est un très bon outil pour cela. Par exemple, un tel script peut énumérer les 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

On sait que des objets comme SPSite et SPWeb doivent être Dispose()-d après un appel, sinon des fuites de mémoire se produisent. Le mieux 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 nettoie après l'exécution-est-il si mauvais de ne pas appeler dispose()?

Donc, ma question Est - il un danger si parfois j'exécute des scripts comme celui-ci; cela affectera-t-il la stabilité globale de la batterie SharePoint (ou du serveur sur lequel j'exécute le script)?

30
demandé sur naivists 2010-01-04 17:31:37

5 réponses

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

En général : dispose tout, car Dispose est le moyen du framework. net de libérer des ressources externes (telles que les poignées de fichiers, les ports TCP, les connexions de base de données, etc.). Les ressources ne sont pas garanties d'être libérées sauf si vous appelez Dispose (). Alors méfiez-vous. C'est la réponse générale, non SharePoint.

Plus précisément lorsque vous traitez avec SharePoint : Lorsque vous fermez le PowerShell.processus exe, le la mémoire est libérée. Si vous avez besoin de disposer des objets pour réduire la pression de la mémoire (important dans les environnements de production ou si vous bouclez tous les sites / Web), assurez-vous de disposer. Sinon, vous n'avez pas à 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 durée (soit dans un ASP.NET processus de travail ou OWSTimer.exe) et ne pas disposer peut causer difficile à dépanner, soudaine catastrophes (c'est-à-dire, le serveur web va boom). Ces problèmes de performances catastrophiques/OutOfMemoryExceptions ne m'affectent pas la plupart du temps lorsque vous travaillez dans PowerShell. Je lance des scripts ad-hoc, je gaspille ~3-50MB 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-émission.

J'ai construit des scripts pour travailler avec SharePoint, et la plupart du temps Je ne me soucie pas de disposer.

Voici un script dans lequel je éliminer les objets SPSite et SPWeb

Voici un script dans lequel je ne prends pas la peine de disposer un objet SPSite

16
répondu Peter Seale 2010-01-05 05:42:51

Idéalement, vous devriez appeler Dispose si possible. Même à L'intérieur de PowerShell.

Les bibliothèques SharePoint incluent beaucoup de code qui n'est qu'un wrapper autour des objets COM - et pour rendre la vie plus amusante, beaucoup de ces objets COM ont leurs propres pools et caches. L'appel. net à disposer indique simplement aux objets COM qu'ils peuvent libérer leurs propres objets (qui peuvent avoir une durée de vie en dehors du processus appelant).

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

4
répondu Goyuix 2010-01-08 00:03:08

Il suffit de suivre ce.

Même si c'est un script simple qui libère de la mémoire une fois exécuté, vous ne savez jamais si à un moment donné cela va être copié / collé dans une boucle interne d'un script plus grand: -)

Pour l'exactitude, vous devez toujours disposer des Objets SP comme spécifié dans le lien ci-dessus.

3
répondu Ariel 2010-01-07 02:46:05

Si le shell accède à une ressource externe dont la durée de vie est supérieure à celle du script PowerShell, il doit appeler Dispose.

Cependant, si c'est une ressource allouée par le script, il n'est pas besoin de nettoyer. Lorsque le script se termine, toute la mémoire allouée pour le script sera nettoyée.

2
répondu Larry Watanabe 2010-01-04 14:50:52

Alors que la fermeture du processus va nettoyer les choses, soyez prudent. Si vous deviez faire une boucle impliquant tous les sites de votre ferme, une élimination manquante peut rapidement consommer des quantités importantes de mémoire, ce qui ralentira votre serveur à une analyse. Puisque les scripts sont les plus utiles pour les opérations par lots, gardez toujours cela à l'esprit.

2
répondu James 2010-01-05 01:14:58