2013-08-16 16 views
2

我已經編寫了一個AutoIt腳本來自動執行我的服務器的測試用例。但我意識到我的服務器正在泄漏內存。它開始於10   MB,並且在所有測試用例結束時達到大約40   MB(Task Manager值)。自動IT腳本知道特定應用程序的內存使用情況

我想知道是否可以編寫AutoIt腳本來檢查我在任務管理器中運行的進程(應用程序)的值,並獲取它的內存狀態,以便在每個測試用例運行,我可以知道內存的差異,並且可能會先嚐試修復更大的內存泄漏。

我曾嘗試搜索如何使用AutoIt檢索任務管理器的值,但迄今爲止我還沒有成功。

我該怎麼辦?

回答

3

您正在尋找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

+0

感謝它工作:),但我無法理解你的代碼。什麼是ObjGet試圖做什麼,它從哪裏試圖獲得。我也不明白$ pid <> -1。對不起,我是autoit – user1692342

+1

** 1。**正如其文檔中所述,ObjGet「從現有進程或文件名中檢索對COM對象的引用。」所以你從WMI服務中獲得一個COM對象。有了它,你可以使用像ExecQuery這樣的方法來獲得一個類似SQL查詢的結果。 ** 2。** $ pid <> -1'只是檢查一個有效的PID。當您使用「運行(...)」功能時,您將獲得新創建的應用程序的有效PID,但只有當可以找到該程序時。所以基本上這就是:當你沒有一個有效的PID時,不要對COM對象做任何事情 - 否則'$ colItems'將無效訪問。 – Samoth

+0

非常感謝 – user1692342

相關問題