2012-09-05 76 views
5

我是新來的powershell,但寫了幾個腳本運行在Windows2003服務器上。這絕對比cmd腳本更強大(可能是由於我有編程背景)。但是,當我進一步深入研究時,我發現:Powershell內存使用 - 昂貴?

  1. 每個啓動的腳本都將在1個powershell進程下運行,即。 你會看到每個腳本都有一個新的powershell進程。
  2. 我爲內存測試的腳本非常簡單,例如,構建一個 字符串或查詢環境變量,然後啓動睡眠60秒,所以沒有什麼需要(至於內存使用情況)。但是每個進程需要大約30MB大約需要 。叫我吝嗇,但因爲有內存密集的應用程序計劃每天運行,並且如果我需要安排一個 幾個powershell腳本定期運行,也許一些腳本 作爲服務連續運行,我一定會盡量保持內存 消耗盡可能低。 < - 這是因爲我們最近 由於內存不足而經歷了很大的應用程序故障。

我還沒有涉及到C#,但是會有人認爲它有時可能會更好地寫在C#中的任務?

同時,我已經看到有關PowerShell內存泄漏的帖子。我是否正確地認爲腳本創建的內存會佔用PowerShell的進程空間,以便當腳本終止,PowerShell終止時,創建的內存會被清除?

+0

如果您編輯問題以包含可重複使用的案例,例如腳本,啓動方式的詳細信息以及您如何確定內存使用情況,它將幫助PS大師。祝你好運。 – shellter

回答

4

我自己的PowerShell.exe 2.0(未運行腳本)在XP上約爲30MB。這些日子裏,每臺機器的平均內存不應該讓你擔心。關於內存泄漏,有些情況下人們使用的第三方庫在對象沒有正確處置時會發生內存泄漏。要解決這些問題,您必須使用[gc]::Collect()手動調用垃圾回收器,但這種情況非常少見。其他時候,我看到人們使用Get-Content來讀取一個非常大的文件,並在使用它之前將其分配給一個變量。這也會佔用大量的內存。在這種情況下,您可以使用管道一次讀取文件部分以減少內存佔用量。

+1

當您可以進行流式工作時,PowerShell的工作效率最高,即一次對一個項目進行操作,並且不會將所有項目存儲在變量中供以後使用(如本答案中指出的那樣)。即使在流式場景中,您也必須留意某些無法流式傳輸的cmdlet,例如指定了-AutoSize參數的Sort-Object,Group-Object和Format-Table。 –

+0

@KeithHill提供了一個很好的觀點,因爲Keith提到的cmdlet類型需要在處理之前從管道接收所有數據,所以儘管'Get-Content'能夠一次處理文件部分並通過管道流式傳輸,類似'Sort-Object'的cmdlet將需要緩衝所有可能導致內存不足錯誤的傳入數據。 –

5

1 - 是的,一個新的過程被創建。運行cmd腳本,vb腳本或C#編譯的可執行文件時也是如此。

2 - 加載PowerShell主機和運行時將需要一些不平凡的內存量,這將隨系統和版本的不同而不同。它通常是一個比cmd shell或專用C#exe更重的進程。對於這些MB,您將獲得豐富的運行時和庫支持,使Powershell如此強大。

總評:

  • 操作系統分配每個進程的內存。一旦進程終止,它的所有內存都將被回收。這是任何現代操作系統的總體設計,並不特定於Powershell甚至Windows。
  • 如果您的團隊在硬件上運行關鍵業務應用程序,以至少數30MB的進程可能導致災難性故障,那麼您會遇到更大的問題。打開瀏覽器並轉到Facebook將會消耗更多的內存。
  • 在它需要你找出一些神祕的批處理腳本解決方案的時候,你很可能建立在PowerShell中更好的解決方案,和你的公司能買得起新的專用硬件與計費時間節省:-)
  • 你應該使用最適合這項工作的工具。 Powershell是經常是正確的工具,但並非總是如此。這對於在Windows環境(文件處理,AD工作,計劃任務,設置權限等)中自動執行管理任務非常有用。對於高性能,高度算法的任務或針對原始.NET API的複雜編碼,這不太好。對於這些任務,C#會更有意義。
  • Powershell得到了微軟(以及一個大用戶社區!)的巨大支持/支持,並且已經非常明確地表明它是Windows未來首選的腳本環境。所有新的Windows服務器端技術都支持PowerShell。如果你在管理/ IT方面工作,在Powershell中建立一些技能是明智的投資。我永遠不會阻止某人學習C#,但如果你的角色比開發者更具有IT意義,那麼Powershell將會更經常地成爲正確的工具,並且你的同事也更有可能瞭解它。
+0

偉大的指針! –