【问题标题】:Retrieve memory consumption of a process检索进程的内存消耗
【发布时间】:2013-08-19 06:24:34
【问题描述】:

我的 AutoIt 脚本自动执行测试用例。我怀疑有些东西正在泄漏内存。它从 10 MB 开始,当测试用例结束时,它达到大约 40 MB(Task Manager 值)。

我希望我的 AutoIt 脚本在每个测试用例之后报告内存消耗。知道了差异,我可能可以找到原因。

如何使用 AutoIt 脚本检索进程的内存消耗?

【问题讨论】:

    标签: windows memory-leaks autoit working-set


    【解决方案1】:

    您正在寻找 WorkingSetSize,它可能与您的任务管理器中列出的值不完全相同。根据它的documentation,工作集是在给定时间物理映射到进程上下文的内存量。

    判断方法如下:

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"
    $pid = Run("notepad")
    
    $objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = " & $pid, "WQL", _
                    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    
    If IsObj($colItems) And $pid <> -1 Then
       For $objItem In $colItems
          ConsoleWrite("WorkingSetSize: " & $objItem.WorkingSetSize & @CRLF)
       Next
    Else
       ConsoleWrite("No WMI Objects Found for class 'Win32_Process' with ProcessId = " & $pid & @CRLF)
    EndIf
    

    您也可以使用此方法从Win32_Process 对象中找出任何other value

    【讨论】:

    • 谢谢它的工作:),但我无法理解你的代码。 ObjGet 试图做什么,它试图从哪里得到。我也不明白 $pid -1。对不起,我是 autoit 的新手
    • 1. 正如其文档中所说,ObjGet“从现有进程或文件名中检索对 COM 对象的引用”。因此,您从 WMI 服务中获得了一个 COM 对象。有了它,您可以使用它的方法,如ExecQuery 来获取简单的 SQL 查询的结果。 2. $pid &lt;&gt; -1 只检查有效的 PID。当您使用Run(...) 函数时,您将获得新创建的应用程序的有效PID,但仅限于可以找到该程序时。所以基本上这就是说:当你没有一个有效的 PID 时,不要对 COM 对象做任何事情 - 否则 $colItems 将无法访问。
    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多