À 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)?
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
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
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.
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.
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.