代码之家  ›  专栏  ›  技术社区  ›  naivists

不在Powershell中处理()有多糟糕?

  •  31
  • naivists  · 技术社区  · 15 年前

    有时我们需要在SharePoint中执行一些小的管理任务。一个简单的PowerShell脚本是一个非常好的工具。例如,此类脚本可以枚举列表的事件处理程序:

    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
    $site = new-object Microsoft.SharePoint.SPSite($args[0])   
    $site.RootWeb.Lists["MyList"].EventReceivers > C:\MyListHandlers.txt
    

    众所周知,像这样的物体 SPSite SPWeb Dispose() -d在调用后,否则会发生内存泄漏。最好是打电话

    $site.RootWeb.dispose()
    $site.dispose()
    

    在这个脚本的末尾。但是,如果这是一个只运行一次的Powershell脚本,并且我们知道Powershell在执行后会进行清理,那么不调用dispose()是否很糟糕?

    所以,我的问题是——如果有时我运行这样的脚本,会有一些危险吗;它会影响SharePoint场(或运行脚本的服务器)的整体稳定性吗?

    5 回复  |  直到 9 年前
        1
  •  17
  •   Peter Seale    15 年前

    这已被编辑,包括一个安全的,非特定的答案。

    一般来说 :dispose everything,因为dispose是.NET framework释放外部资源(如文件句柄、TCP端口、数据库连接等)的方法。除非调用Dispose(),否则不能保证释放资源。所以要当心。这是一般的、非SharePoint的答案。

    特别是在处理SharePoint时 关闭PowerShell.exe进程时,将释放内存。如果您需要处理对象以降低内存压力(在生产环境中很重要,或者在所有站点/站点上循环),请确保处理。如果没有,你就不必担心处理。

    我们之所以如此热衷于处理,首先是因为大多数SharePoint代码都在长时间运行的进程中运行(在ASP.NET worker进程或OWSTimer.exe中),而未能处理可能会导致难以排除故障、突然发生灾难(即web服务器崩溃)。在PowerShell中工作时,这些灾难性的性能问题/OutOfMemoryException在大多数情况下都不会影响我。我运行临时脚本,由于无法处理对象,我浪费了约3-50MB的RAM,我关闭了PowerShell窗口,内存被释放。

    我已经构建了使用SharePoint的脚本,大多数时候我都不需要处理。

    Here is a script wherein I dispose SPSite and SPWeb objects

    Here is a script in which I don't bother to dispose an SPSite object

        2
  •  4
  •   Goyuix    15 年前

    理想情况下,您应该在可能的情况下调用Dispose。甚至在PowerShell里面。

    SharePoint库包含许多代码,这些代码只是COM对象的包装器——为了让生活更有趣,许多COM对象都有自己的池和缓存。对Dispose的.NET调用实际上只是指示COM对象它们可以释放自己的对象(其生命周期可能超出调用过程)。

    http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx

        3
  •  3
  •   Ariel    15 年前

    跟着 this .

    即使它是一个简单的脚本,一旦执行就会释放内存,但您永远不知道它是否会在某个时候被复制/粘贴到更大脚本的内部循环中:-)

    为确保正确性,应始终按照上面链接中的指定处理SP对象。

        4
  •  2
  •   Larry Watanabe    15 年前

    如果shell正在访问的外部资源的生存期长于PowerShell脚本的生存期,则应调用Dispose。

    但是,如果它是由脚本分配的资源,则无需清理。当脚本退出时,将清除为脚本分配的所有内存。

        5
  •  2
  •   James    15 年前

    虽然关闭该进程将清理一切,但要小心。如果要执行涉及服务器场中所有站点的循环,丢失的dispose会很快消耗大量内存,这会使服务器缓慢爬行。由于脚本编写对批处理操作最有帮助,因此请始终记住这一点。