2015-07-03 54 views
1

我設法創建一些簡單的腳本來捕捉新聞表單網站,但問題是內存泄漏。似乎腳本不釋放內存:( 我試着關閉,空(無不是空不幫助) - 檢查結束行。捕捉網站內存泄露

Do While x<50000 
    Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0") 
    WScript.Sleep 60000 
    oXMLHTTP.Open "GET", "http://www.news.com/sport", False 
    WScript.Sleep 900 
    oXMLHTTP.Send 

    If oXMLHTTP.Status = 200 Then 
    Set html = CreateObject("HTMLfile") 
    html.write oXMLHTTP.responseText 
    ...some code... 

    html=Empty 
    oXMLHTTP=Empty 
    oXMLHTTP.responseText=Empty 
    oXMLHTTP.close 
    oStream.close 
    oStream=Empty 
Loop 

回答

2
  1. 您需要Set x = Nothing釋放對象x
  2. 你不能訪問你之前(oXMLHTTP)
1

在接下來的腳本樁解除對象的成員:

  • oXMLHTTP變量聲明爲global並定義一次用於整個腳本;
  • htmloStream變量是本地的DoSomething程序和被釋放出來的...

然而,一些語句留不清楚我...

Option Explicit 
Dim x, oXMLHTTP 
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0") 
Do While x<50000 
    WScript.Sleep 60000 
    oXMLHTTP.Open "GET", "http://www.news.com/sport", False 
    WScript.Sleep 900 
    oXMLHTTP.Send 
    DoSomething 
    oXMLHTTP.close 
Loop 

Sub DoSomething 
    Dim html, oStream 
    If oXMLHTTP.Status = 200 Then 
    Set html = CreateObject("HTMLfile") 
    html.write oXMLHTTP.responseText 
    '...some code... 
    End If 
    '...another code... 
End Sub 

Local Variables in Sub Procedures

Sub過程中局部變量的值不會在調用之間保留 到程序。

過程中顯式聲明的變量(使用Dim或 等效項)始終是過程本地的。 在過程中使用但未明確聲明的變量也是本地變量,除非 它們在 過程之外的某個更高級別上顯式聲明。

如果在過程中沒有明確聲明變量,那麼如果在腳本級別 上定義的任何內容具有重複的名稱,則會發生命名 衝突。如果您的程序引用了一個未聲明的 變量,該變量與另一個程序,常量或 變量具有相同的名稱,則假定您的程序指向的是該腳本級名稱的 名稱。爲避免這種衝突,請使用Option Explicit聲明強制顯式聲明變量。

Scope and Lifetime of Variables

變量的作用域是,你聲明它決定。當您在過程中聲明變量時,只有該過程 中的代碼才能訪問或更改該變量的值。它具有本地範圍 ,並且是一個過程級變量。如果您在 過程之外聲明瞭變量,則可以使其在 腳本中的所有過程都能識別該變量。這是一個腳本級變量,它具有腳本級別 範圍。

變量的生命週期取決於它存在多長時間。腳本級變量的生命週期 從聲明的時間延長到腳本完成運行的時間 。在過程級別,只有在過程中,纔會存在 變量。當 過程退出時,該變量被銷燬。在執行過程時,局部變量是理想的 作爲臨時存儲空間。您可以在幾個不同的過程 中擁有 相同名稱的局部變量,因爲每個過程僅通過聲明的 的過程來識別。