2012-09-05 77 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

伟大的指针! –