Wie schlimm ist es, nicht in Powershell zu entsorgen ()?
Manchmal müssen wir führen kleine administrative Aufgaben im SharePoint. Ein einfaches PowerShell-Skript ist ein wirklich gutes tool. Zum Beispiel, solch ein Skript auflisten können event-Handler eine Liste:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$site = new-object Microsoft.SharePoint.SPSite($args[0])
$site.RootWeb.Lists["MyList"].EventReceivers > C:\MyListHandlers.txt
Es ist bekannt, dass Objekte wie SPSite
und SPWeb
zu Dispose()
-d nach einem Anruf, sonst memory-leaks auftreten. Das beste würde sein rufen
$site.RootWeb.dispose()
$site.dispose()
am Ende dieses Skripts. Aber wenn dies ist ein Powershell-Skript, das nur einmal ausgeführt werden, und wir wissen, dass PowerShell bereinigt, die nach der Ausführung - es ist so schlecht nicht, rufen Sie dispose()?
So, meine Frage ist - ist es eine Gefahr wenn ich manchmal das ausführen von Skripts wie diesem, wird es Auswirkungen auf die Allgemeine Stabilität der SharePoint-farm (oder der server auf dem ich bin, der das Skript ausführt)?
InformationsquelleAutor der Frage naivists | 2010-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser bearbeitet wurde, um eine sichere, unspezifische Antwort.
IM ALLGEMEINEN: entsorgen Sie alles, denn zu Entsorgen ist .NET framework ist der Weg frei, externe Ressourcen (z.B. Datei-handles, die TCP-ports, Datenbank-verbindungen, etc). Ressourcen werden nicht unbedingt veröffentlicht, es sei denn, Sie rufen Sie Dispose(). Also Vorsicht. Dies ist der Allgemeine, nicht-SharePoint Antwort.
SPEZIELL BEIM UMGANG MIT SharePoint:
Wenn Sie in der Nähe der PowerShell.exe Prozess, wird der Speicher freigegeben. Wenn Sie brauchen, zu entsorgen, Objekte zu halten, Speicher Druck nach unten (wichtig in der Produktion Umgebungen oder wenn Sie Durchlaufen alle Seiten/webs), stellen Sie sicher, Sie zu entsorgen. Wenn nicht, Sie müssen sich keine Gedanken über die Entsorgung.
Der Grund, warum wir so verrückt nach der Entsorgung ist in Erster Linie, weil die meisten SharePoint-code läuft bei lang Laufenden Prozessen (entweder in einer ASP.NET Arbeitsprozess oder OWSTimer.exe) und dann nicht zu entsorgen, kann die Ursache für schwer beheben, plötzliche Katastrophen (D. H., web-server, die boom gehen). Diese katastrophale performance-Probleme/OutOfMemoryExceptions nicht auf mich die meiste Zeit bei der Arbeit in der PowerShell. Ich ausführen von ad-hoc-Skripte, die ich Abfälle ~3-50 MB RAM, da ich nicht zu entsorgen, meine Gegenstände, die ich schließen Sie die PowerShell-Fenster und der Speicher wird freigegeben. Die meisten der Zeit, es ist eine nonissue.
Habe ich gebaut Skripte für die Arbeit mit SharePoint, und die meisten der Zeit, die ich nicht die Mühe mit der Entsorgung.
Hier ist ein Skript, wobei ich entsorgen SPSite und SPWeb-Objekte
Hier ist ein script, in dem ich nicht die Mühe zu entsorgen, ein SPSite-Objekt
InformationsquelleAutor der Antwort Peter Seale
Idealerweise sollten Sie rufen Sie Entsorgen, wenn möglich. Sogar in der PowerShell.
Den SharePoint-Bibliotheken enthalten eine Menge code, der nur einen wrapper für COM-Objekte - und machen das Leben mehr Spaß, viele diese COM-Objekte haben Ihren eigenen pools und caches. Die .NET Aufruf von Dispose wirklich nur beauftragt die COM-Objekte, Sie können frei Ihre eigenen Objekte (das kann haben eine Lebensdauer außerhalb des aufrufenden Prozesses).
Hier weitere relevante Informationen: http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx
InformationsquelleAutor der Antwort Goyuix
Folgen Sie einfach diese.
Selbst wenn es ein einfaches Skript, das leert den Speicher einmal ausgeführt, man weiß ja nie, ob irgendwann werde durch kopieren/einfügen in einer inneren Schleife in einem größeren Skript 🙂
Für die Richtigkeit, sollte man immer entsorgen SP-Objekte gemäß den obigen link.
InformationsquelleAutor der Antwort Ariel
Wenn die shell ist der Zugriff auf eine externe Ressource, die eine Lebensdauer länger als die Lebensdauer des PowerShell-script, dann sollte es Entsorgen.
Allerdings, wenn es eine Ressource allokiert, die von dem Skript, dann gibt es keine Notwendigkeit zu reinigen. Wenn das Skript beendet wird, dann werden alle reservierten Speicher für das Skript bereinigt werden.
InformationsquelleAutor der Antwort Larry Watanabe
Beim schließen wird der Prozess sauber machen, vorsichtig sein. Wenn Sie tun eine Schleife, der alle Websites in der farm, eine fehlende entsorgen kann schnell Essen, bis erhebliche Mengen an Speicher, die verlangsamen wird Ihr server zu einem kriechen. Seit scripting ist sehr hilfreich für batch-Operationen, immer im Hinterkopf behalten.
InformationsquelleAutor der Antwort James