Powershell 长时间运行脚本中的System.OutOfMemoryException

Powershell 长时间运行脚本中的System.OutOfMemoryException,powershell,Powershell,我正在运行powershell脚本以获取一些日志。脚本运行3小时后停止,对Invoke RestMethod的调用引发了System.OutOfMemoryException。有人能详细说明这个问题吗?System.OutOfMemoryException在达到当前shell已用内存的最大值时发生。外壳可用的内存在WinRM设置中配置 要查看当前值,可以从WSMan:localhost\Shell\MaxMemoryPerShellMB中读取它: Get-Item -Path WSMan:loc

我正在运行powershell脚本以获取一些日志。脚本运行3小时后停止,对
Invoke RestMethod
的调用引发了
System.OutOfMemoryException
。有人能详细说明这个问题吗?

System.OutOfMemoryException
在达到当前shell已用内存的最大值时发生。外壳可用的内存在WinRM设置中配置

要查看当前值,可以从WSMan:localhost\Shell\MaxMemoryPerShellMB中读取它:

Get-Item -Path WSMan:localhost\Shell\MaxMemoryPerShellMB
要更改该值,请使用以下命令(使用您想要使用的内存量):

注意:

要查看和更改该值,必须确保正在运行提升的Shell,并且WinRM服务正在运行

您可以通过以下方式启动服务:

Start-Service WinRM
有关更多信息,请查看和


注:

问题很可能是,您让脚本无法正常运行

这将导致OutOfMemoryException,因为没有良好的垃圾收集


也许要重新思考如何解决任务,删除未使用/填充过多的变量,或者每天x次运行脚本,而不是一直运行一个脚本。

如果您向我们展示代码,我们可以看到什么正在吞噬您的内存..我已经看到很多PowerShell脚本是用C#风格编写的,包含大量PowerShell对象集合。PowerShell对象相当大,因为它们是通过管道传输的(而不是在内存中收集)。如果您开始初始化PowerShell对象的.Net列表或使用,则可能没有正确使用管道,建议您共享代码,并最终以PowerShell的方式对其进行优化。这一点很好,但仅适用于PowerShell远程处理(对充当服务器的机器)。我不知道应用于本地调用的内存配额。你能解释一下没有好的垃圾收集是什么意思吗(我是天真地问的)?与其增加内存设置,不如先优化你的代码,这样它就不会运行几个小时,也不会消耗太多内存。(我已经能够将运行超过12小时的脚本的执行时间减少到5分钟)
Start-Service WinRM