Powershell内存使用 - 价格昂贵?

时间:2012-09-05 19:37:52

标签: powershell

我是powershell的新手,但已经编写了一些在windows2003服务器上运行的脚本。它肯定比cmd脚本更强大(可能是因为我有编程背景)。但是,当我进一步深入研究时,我注意到了:

  1. 每个启动的脚本都将在1个PowerShell进程下运行,即。 你会看到每个脚本都有一个新的PowerShell进程。
  2. 我测试内存的脚本非常简单,比如说,构建一个 字符串或查询环境变量,然后启动 - 睡眠60 秒,所以没什么需要(关于内存使用)。但每个过程都需要 大约> 30MB。叫我吝啬,但因为内存密集 计划每天运行的应用程序,如果我需要安排一个 很少有PowerShell脚本可以定期运行,也许还有一些脚本 作为一项服务不断运行,我当然会努力保持记忆 消费尽可能低。 < - 这是因为我们最近 由于缺乏记忆而经历了大量的应用程序故障。
  3. 我还没有涉及过C#,但有人会认为用C#编写任务有时会更好吗?

    与此同时,我在powershell中看过有关内存泄漏的帖子。我是否认为脚本创建的内存将与powershell的进程空间一致,因此当脚本终止因此powershell终止时,创建的内存会被清除?

2 个答案:

答案 0 :(得分:5)

我的PowerShell.exe 2.0本身(不运行脚本)在XP上大约是30MB。这些天,每台机器的平均内存不应过多担心。关于内存泄漏,有些情况下,当对象没有得到妥善处理时,人们使用第三方库存在内存泄漏。要解决这些问题,您必须使用[gc]::Collect()手动调用垃圾收集器,但这种情况很少见。其他时候我见过人们使用Get-Content读取一个非常大的文件并在使用之前将其分配给变量。这也将占用大量内存。在这种情况下,您可以使用管道一次读取文件部分,以减少内存占用。

答案 1 :(得分: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#,但如果你的角色比开发人员更多,那么Powershell将会更频繁地成为正确的工具,你的同事也更有可能理解它。