Powershell 3.0 Get-Process有时会在进程中返回内存的负值?

时间:2014-02-20 15:39:42

标签: powershell memory powershell-v2.0 powershell-v3.0

我很好奇这是怎么发生的? 我的命令只是

get-process

进程正在运行并且确实消耗了一些内存,但为什么WS(K)和VM(M)有负值? (顺便说一句。我不确切知道WS和VM代表什么) 我正在使用PowerShell 3.0

因为我运行了一个powershell脚本来检查值并报告我,如果值低于0,我现在收到一封邮件,因为它低于0:)

我怎样才能将其转化为价值,无论是负面还是正面?

negative values

1 个答案:

答案 0 :(得分:4)

这个here的一些背景知识,但实际上这是PowerShell(或更深层次的)在32位/ 64位和有符号/无符号数字之间混淆。

如果我在64位服务器上运行get-process DBPROCESS有一些重要的数据库进程,我可以看到一些负数,例如。

. Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
. -------  ------    -----      ----- -----   ------     -- -----------
.   19357     348  -297416    -581352    34 5,407.32   6012 DBPROCESS

我将查看WS(K) - WorkingSet编号。

重新运行以下命令表明还有其他64位属性表示相同的参数:

get-process DBPROCESS | select-object -property working* | fl
WorkingSet   : -595304448
WorkingSet64 : 3699662848

WorkingSet的值对应于WS(K)列乘以1024

即。 -581385 x 1024 = -595304448

我们可以看到,WorkingSet64是一个更大的数字 - 远远大于32位有符号整数可以表示的最大+ ve数(2,147,483,647)。

3699662848(根据Windows计算器)的二进制表示是(11011100 10000100 01100000 00000000) - 只有32位,但至关重要的是,最重要(最左边)位是1。

当数字以二进制表示时,最高有效位表示符号。最高有效位(MSB)为0表示它是正数。相反,MSB为1表示它是负数。

在此示例中,PowerShell(或Windows)获取这些位并将它们解释为32位有符号整数(根据Windows计算器再次)为-595304448。

有趣的是,如果我从远程计算机(Windows 7 - 64位)运行get-process,则两个数字都显示为负数。这是我怀疑的另一个问题......

WorkingSet   : -595304448
WorkingSet64 : -595304448