小型powershell脚本占用大量内存
我用这个脚本捕获网络上的IP,与历史数据包捕获进行比较,作为更大的问题解决练习的一部分小型powershell脚本占用大量内存,powershell,Powershell,我用这个脚本捕获网络上的IP,与历史数据包捕获进行比较,作为更大的问题解决练习的一部分 function qp($comp) { $p = ping $comp -n 1 -w 2 -4 IF($? -eq $true){$out = $p[1].split("[")[1].split("]")[0]} else{$out = $False} return $out } $comps = Get-Content C:\PacketCapture\
function qp($comp)
{
$p = ping $comp -n 1 -w 2 -4
IF($? -eq $true){$out = $p[1].split("[")[1].split("]")[0]}
else{$out = $False}
return $out
}
$comps = Get-Content C:\PacketCapture\comps.txt
DO
{
foreach($comp in $comps)
{
ECHO "$(qp $comp);$comp" >>"C:\PacketCapture\IP_$(Get-date -format HHmm-ddMMyy).txt"
}
Start-sleep 3600
}
until($null -eq "WANG")
我在两周前就开始这样做了,上周中旬,它运行的终端因为power shell进程的内存使用量接近2GB而逐渐停止
我停止并重新启动了它,今天早上我们再次使用了1.2GB内存
虽然不是特别重要,但我已将其修改为运行一次,然后停止/启动自身,我想知道是哪个元素导致内存泄漏,以及将来如何识别它。尝试使用
[System.GC]::Collect()将垃圾收集引入代码中。
来源:您可以尝试手动调用垃圾回收。我认为
do
/until
循环是一个很好的地方:
DO
{
foreach($comp in $comps)
{
ECHO "$(qp $comp);$comp" >>"C:\PacketCapture\IP_$(Get-date -format HHmm-ddMMyy).txt"
}
Start-sleep 3600
[GC]::Collect()
}
until($null -eq "WANG")
我可以看出情况更糟,但您是否尝试过使用
测试连接-安静?它将消除对字符串操作的需要,尽管这应该会很快完成。另外,您运行此应用程序的PowerShell版本是什么。首先,comps.txt的大小是多少?第二,有cmdlet时为什么还要使用ping.exe?最后,您的do..till很有趣,但while($true){…}
更常见。我同意其他人关于使用测试连接的看法。也就是说,如果您在[GC]::Collect()
中加入一个,可能是在启动睡眠后的照看中?只是好奇这是否有帮助。请从sysinternals中尝试VMMap。它允许您查看一段时间内进程的内存使用模式。当内存为1.2GB时,您可以使用procdump(或procexp或taskmanager->右键单击->创建转储文件)进行内存转储,并使用WinDbg.fwiw对其进行分析-在删除启动睡眠的情况下,在我的计算机上运行此操作时,我没有注意到任何内存消耗/泄漏。您实际上应该包括链接中的代码。。。这是一条线。如果没有它,这是一个糟糕的答案。这是一个正确的答案,但是当链接消失时会发生什么呢?这是一个目前唯一的答案,这是不鼓励的。我的评论并不差。这是一种建设性的批评。但如果你在答案中写下15个字符并保留上下文链接,用户就不必费心去寻找任何东西。Jimbo感谢你的回答,Matt在技术上是正确的。堆栈溢出希望您在此处包含答案的关键,而不仅仅是通过链接。但是@Matt,Stack Overflow是协作性的,请随意编辑Jimbo的答案以包含相关细节。@Patrick我知道是的。我采取了“教人钓鱼”的方法。