Comment le mauvais est qu'il ne dispose() dans Powershell?
Parfois, nous avons besoin d'effectuer des petites tâches d'administration SharePoint. Un simple script PowerShell est un très bon outil pour cela. Par exemple, un tel script peut énumérer les gestionnaires d'événements de la 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 les objets comme les SPSite
et SPWeb
être Dispose()
-d après un appel, sinon fuites de mémoire se produisent. Le mieux serait d'appeler
$site.RootWeb.dispose()
$site.dispose()
à la fin de ce script. Mais si c'est un script Powershell qui ne sera exécuté qu'une seule fois et nous savons que PowerShell nettoie après l'exécution - est-ce si mal de ne pas appeler dispose()?
Donc, ma question est - est-il un danger si parfois je exécuter des scripts comme ça; il a un impact sur la stabilité de la batterie de serveurs SharePoint (ou du serveur sur lequel je suis l'exécution du script)?
- Excellent outil, mais il sent comme Perl et me tient à l'écart 😉
- Ce fut ma première impression, mais il permet de travailler avec tout .net classe sans compiler etc.
Vous devez vous connecter pour publier un commentaire.
Ce qui a été modifié pour inclure un coffre-fort, non spécifique de la réponse.
EN GÉNÉRAL: éliminer tout, parce que Disposer est la .NET framework de façon à libérer des ressources externes (tels que les descripteurs de fichiers, les ports TCP, connexions de base de données, etc). Les ressources ne sont pas garantis pour être libéré, à moins que vous appelez dispose(). Alors méfiez-vous. C'est le général, non SharePoint réponse.
SPÉCIFIQUEMENT LORSQUE vous TRAITEZ AVEC SharePoint:
Lorsque vous fermez la PowerShell.exe processus, la mémoire est libérée. Si vous avez besoin de jeter des objets à garder la mémoire de la pression vers le bas (c'est important dans les environnements de production ou si vous êtes en boucle sur tous les sites/webs), assurez-vous d'en disposer. Si non, vous n'avez pas besoin de vous soucier de les jeter.
La raison pour laquelle nous sommes tellement fou sur l'élimination, en premier lieu, parce que la plupart SharePoint code s'exécute dans le processus long (soit dans un ASP.NET processus de travail ou d'OWSTimer.exe) et à défaut de disposer peut entraîner des difficultés à résoudre, de catastrophes soudaines (c'est à dire, un serveur web de go-boom). Ces terribles problèmes de performances/OutOfMemoryExceptions ne m'affecte pas la plupart du temps lorsque vous travaillez dans PowerShell. J'ai ad-hoc, les scripts, j'ai déchets ~3-50 MO de RAM, car je n'arrive pas à disposer de mes objets, j'ai fermer la fenêtre PowerShell et la mémoire est libérée. Plus du temps, c'est un nonissue.
J'ai construit des scripts pour travailler avec SharePoint, et la plupart du temps je n'ai pas pris la peine de les jeter.
Voici un script dans lequel je me débarrasser SPSite et SPWeb objets
Voici un script dans lequel je n'ai pas pris la peine de jeter un objet SPSite
Idéalement, vous devriez appeler Éliminer si possible. Même à l'intérieur de PowerShell.
Les bibliothèques SharePoint inclure beaucoup de code qui est juste un wrapper autour des objets COM et pour rendre la vie plus agréable, beaucoup de ces objets COM ont leurs propres piscines et les caches. L' .NET appel à Disposer vraiment juste indique le COM les objets qu'ils peuvent libérer leurs propres objets (qui peuvent avoir une durée de vie à l'extérieur du processus appelant).
Voici quelques autres informations pertinentes: http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx
Il suffit de suivre cette.
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é qui va être copié/collé dans une boucle interne d'une plus grande script 🙂
Pour la correction, vous devez toujours disposer SP objets comme spécifié dans le lien ci-dessus.
Si le shell est l'accès à une ressource externe qui a une durée de vie plus longue que la durée de vie de l'script PowerShell, puis il devrait 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, puis toute la mémoire allouée pour le script sera nettoyé.
Lors de la fermeture du processus permettra de nettoyer les choses, être prudent. Si vous décidez de faire une boucle impliquant tous les sites dans votre batterie de serveurs, un manque d'aliéner peut manger rapidement d'importantes quantités de mémoire qui va ralentir votre serveur à un rampement. Depuis le script est très utile pour les opérations de traitement, gardez toujours à l'esprit.