¿Qué tan malo es no disponer() en Powershell?
sharepoint sharepoint-2007 (5)
Esto ha sido editado para incluir una respuesta segura e inespecífica.
EN GENERAL : elimine todo, porque Dispose es la forma del marco .NET de liberar recursos externos (como manejadores de archivos, puertos TCP, conexiones de bases de datos, etc.). No se garantiza que los recursos se liberarán a menos que llame a Dispose (). Así que ten cuidado. Esta es la respuesta general que no es de SharePoint.
ESPECÍFICAMENTE CUANDO SE TRATA DE SharePoint : cuando cierra el proceso de PowerShell.exe, la memoria se libera. Si necesita desechar objetos para mantener la presión de la memoria baja (importante en entornos de producción o si está recorriendo todos los sitios / webs), asegúrese de desecharlos. Si no, no necesita preocuparse por deshacerse de él.
La razón por la que estamos tan locos por la eliminación en primer lugar es porque la mayoría de los códigos de SharePoint se ejecutan en procesos de larga ejecución (ya sea en un proceso de trabajo ASP.NET o en OWSTimer.exe) y no pueden eliminarse, lo que puede dificultar la resolución de problemas , catástrofes repentinas (es decir, el servidor web se dispara). Estos problemas de rendimiento catastrófico / OutOfMemoryExceptions no me afectan la mayor parte del tiempo cuando trabajo en PowerShell. Ejecuto scripts ad-hoc, desperdicio ~ 3-50MB de RAM porque no puedo eliminar mis objetos, cierro la ventana de PowerShell y la memoria se libera. La mayoría de las veces no es un problema.
Construí scripts para trabajar con SharePoint, y la mayoría de las veces no me molesto en deshacerme de ellos.
Aquí hay un script en el que dispongo de objetos SPSite y SPWeb
Aquí hay un script en el que no me molesto en deshacerme de un objeto SPSite
A veces necesitamos realizar pequeñas tareas administrativas en SharePoint. Un simple script de PowerShell es una herramienta realmente buena para eso. Por ejemplo, tal script puede enumerar manejadores de eventos de una lista:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$site = new-object Microsoft.SharePoint.SPSite($args[0])
$site.RootWeb.Lists["MyList"].EventReceivers > C:/MyListHandlers.txt
Se sabe que los objetos como SPSite
y SPWeb
tienen que ser Dispose()
-d después de una llamada, de lo contrario, se producen pérdidas de memoria. Lo mejor sería llamar
$site.RootWeb.dispose()
$site.dispose()
al final de este guion. Pero si se trata de un script de Powershell que solo se ejecutará una vez, y sabemos que PowerShell se limpia después de la ejecución, ¿es tan malo no llamar a disponer ()?
Entonces, mi pregunta es: ¿hay algún peligro si a veces ejecuto scripts como este? ¿afectará la estabilidad general de la granja de SharePoint (o del servidor en el que estoy ejecutando la secuencia de comandos)?
Idealmente, debe llamar a Dispose cuando sea posible. Incluso dentro de PowerShell.
Las bibliotecas de SharePoint incluyen una gran cantidad de código que es solo una envoltura alrededor de los objetos COM, y para hacer la vida más divertida, muchos de esos objetos COM tienen sus propios pools y cachés. La llamada .NET a Dispose realmente solo indica a los objetos COM que pueden liberar sus propios objetos (que pueden tener una vida útil fuera del proceso de llamada).
Aquí hay información más relevante: http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx
Si bien el proceso de cierre limpiará las cosas, tenga cuidado. Si tuviera que hacer un ciclo que involucre a todos los sitios de su granja, una disposición que falte rápidamente puede consumir una cantidad significativa de memoria que ralentizará su servidor a paso de tortuga. Dado que las secuencias de comandos son más útiles para las operaciones por lotes, siempre tenlo en cuenta.
Si el shell está accediendo a un recurso externo que tiene una vida útil más larga que la duración del script de PowerShell, debe llamar a Dispose.
Sin embargo, si es un recurso asignado por el script, entonces no hay necesidad de limpiarlo. Cuando sale la secuencia de comandos, se limpiará toda la memoria asignada para la secuencia de comandos.
Solo sigue this
Incluso si se trata de un script simple que libera memoria una vez ejecutada, nunca se sabe si en algún momento se va a copiar / pegar en un bucle interno de un script más grande :-)
Para mayor exactitud, siempre debe disponer de objetos SP como se especifica en el enlace de arriba.