启动睡眠内存泄漏(或导致powershell内存泄漏)?

启动睡眠内存泄漏(或导致powershell内存泄漏)?,powershell,Powershell,这个问题是来自 我没有得到一个有效的答案,所以如果这个论坛可以帮助的话,试试看。这妨碍了我的工作 这是我的两个powershell脚本。第一个是创建事件源,第二个是使用4个线程生成事件。在每个线程中使用启动睡眠来控制事件生成速率。如果我删除启动睡眠,则powershell内存使用量是恒定的,否则它会快速增长,直到所有系统内存都被使用,并且系统变得非常缓慢 这是一个已知的问题吗?有解决办法吗?谢谢你提供任何线索 # use this script to create channel and sou

这个问题是来自

我没有得到一个有效的答案,所以如果这个论坛可以帮助的话,试试看。这妨碍了我的工作

这是我的两个powershell脚本。第一个是创建事件源,第二个是使用4个线程生成事件。在每个线程中使用启动睡眠来控制事件生成速率。如果我删除启动睡眠,则powershell内存使用量是恒定的,否则它会快速增长,直到所有系统内存都被使用,并且系统变得非常缓慢

这是一个已知的问题吗?有解决办法吗?谢谢你提供任何线索

# use this script to create channel and source if they does not exist.

$logName = "TestLog"
$sourceName = "TestSource"

New-EventLog -LogName $logName -Source $sourceName

# maximumSize's max is 4G.
Limit-EventLog -LogName $logName -OverflowAction OverWriteOlder -RetentionDays 30 -MaximumSize 3080000KB
事件生成脚本:

# use this script to generate events in TestLog channel.

Param(
  [int]$sleepIntervalInMilliSeconds = 0
)

$eventGenScript = {
  $logName = "TestLog"
  $sourceName = "TestSource"

  while($true) {
    Write-EventLog -LogName $logName -Source $sourceName -Message "perfLog" -EventId 0 -EntryType information
    Start-Sleep -ms $sleepIntervalInMilliSeconds
  }
}

$threadCount = 4

for($i=0; $i -lt $threadCount; $i++)
{
  Start-Job $eventGenScript  
}

read-host "type a key to exit. You need to wait for some time for threads to exit."

这并不是说
Start Sleep
有内存泄漏,您使用无效参数(
-ms
)调用它,并且作业的进程内存中充满了错误消息,因为您在无限循环中不断调用(invalid)语句

演示:

PS C:\> Start-Sleep -ms 100
Start-Sleep : A parameter cannot be found that matches parameter name 'ms'.
At line:1 char:13
+ Start-Sleep -ms 100
+             ~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Sleep], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.StartSleepCommand
您有三种选择来处理此问题:

  • 在脚本块内定义变量:

    PS C:\> $job = Start-Job -ScriptBlock {
    >> $ms = 100
    >> $ms
    >> Start-Sleep -Milliseconds $ms
    >> }
    >>
    PS C:\> $job | Wait-Job | Receive-Job
    100
  • 将变量作为参数传递到scriptblock中:

    PS C:\> $ms = 100
    PS C:\> $job = Start-Job -ScriptBlock {
    >> param($ms)
    >> $ms
    >> Start-Sleep -Milliseconds $ms
    >> } -ArgumentList $ms
    >>
    PS C:\> $job| Wait-Job | Receive-Job
    100
    PS C:\>$ms=100
    PS C:\>$job=开始作业-脚本块{
    >>参数($ms)
    >>$ms
    >>开始睡眠-毫秒$ms
    >>}-ArgumentList$ms
    >>
    PS C:\>$job |等待作业|接收作业
    100

底线:更换

Start-Sleep -ms $sleepIntervalInMilliSeconds
开始睡眠-ms$sleepIntervalInMilliSeconds

启动睡眠-毫秒$使用:sleepIntervalInMilliSeconds

问题将消失。

并不是因为
开始睡眠
有内存泄漏,而是您使用无效参数(
-ms
)调用它,并且作业的进程内存充满了错误消息,因为您在无限循环中不断调用(无效)语句

演示:

PS C:\> Start-Sleep -ms 100
Start-Sleep : A parameter cannot be found that matches parameter name 'ms'.
At line:1 char:13
+ Start-Sleep -ms 100
+             ~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Sleep], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.StartSleepCommand
您有三种选择来处理此问题:

  • 在脚本块内定义变量:

    PS C:\> $job = Start-Job -ScriptBlock {
    >> $ms = 100
    >> $ms
    >> Start-Sleep -Milliseconds $ms
    >> }
    >>
    PS C:\> $job | Wait-Job | Receive-Job
    100
  • 将变量作为参数传递到scriptblock中:

    PS C:\> $ms = 100
    PS C:\> $job = Start-Job -ScriptBlock {
    >> param($ms)
    >> $ms
    >> Start-Sleep -Milliseconds $ms
    >> } -ArgumentList $ms
    >>
    PS C:\> $job| Wait-Job | Receive-Job
    100
    PS C:\>$ms=100
    PS C:\>$job=开始作业-脚本块{
    >>参数($ms)
    >>$ms
    >>开始睡眠-毫秒$ms
    >>}-ArgumentList$ms
    >>
    PS C:\>$job |等待作业|接收作业
    100

底线:更换

Start-Sleep -ms $sleepIntervalInMilliSeconds
开始睡眠-ms$sleepIntervalInMilliSeconds

启动睡眠-毫秒$使用:sleepIntervalInMilliSeconds

问题就会消失。

发生这种情况时,内存分配在哪里?有多少进程正在运行?发生这种情况时,内存分配在哪里?有多少进程正在运行?