2010-10-04 55 views
2

問候,
我一直在爲使用8位微控制器的某些硬件開發Web界面。該網頁使用HTML,JavaScript,JSON和XHR(XMLHttpRequest)進行通信。我想要做的是創建一個頁面,每隔250mS更新控制器的新值,使用setInterval,以便網頁實時更新,使其更像是一個應用程序。使用XMLHttpRequest自動網頁刷新內存泄漏

我已經完成了它的大部分工作,但發現代碼中存在內存泄漏,包括我測試過的兩種瀏覽器,IE和Chrome。

我在網上研究過,看起來像其他人有同樣的問題,我試圖執行不同的修復,但沒有成功。

下面是一些代碼快照,希望能夠更好地解釋一些事情,我修改了變量,使它們在沒有看到完整應用程序的情況下變得更有意義。

// start the pageRefreshTimer to update values 
var pageRefreshTimer = window.setInterval(updateValues, 250); 

// Standard XHR opener 
HTTP.getText = function(url, callback) { 
    var request = HTTP.newRequest(); // Searches array of standard XMLHttpRequest functions to try, code not shown... 
    request.onreadystatechange = function() { 
     if (request.readyState == 4 && request.status == 200) { 
      callback(request.responseText) // responseText becomes JSONText below 
     } 
    } 
    request.open("GET", url); 
    request.send(null); 
} 

// Function that is constantly refreshed by HTML page to simulate real-time application 
updateValues = function(parameter, value) { 

    newURL = newURL + "?" + parameter; // newURL is defined elsewhere in the code... 

    // Send the url and create the JSONObject 
    HTTP.getText(newURL, function(JSONText) { 
        var JSONObject = eval('(' + JSONText + ')'); // Specific notation for JSON 

        // Load object values into Javascript variables 
        Controller.detectorPosition = JSONObject.detectorPosition; 
        Controller.offset = JSONObject.offset; 
        Controller.actuatorPosition = JSONObject.actuatorPosition; 
    }); 

    delete JSONObject; // My attempt at manual garbage collection, didn't resolve the memory leak 
} 

供您參考,會從微控制器發送到瀏覽器會是這個樣子的JSON文件...

{ "offset": "1500", 
"detectorPosition": "1558", 
"actuatorPosition": "120" } 

這是否看起來像一個問題,在「倒閉潮」代碼?

使用Chrome中的開發工具(Ctrl-Shift-J),我注意到有多個對ParameterValues.json文件(350B大小)的調用,因爲這是存儲來自微控制器;但瀏覽器以某種方式在內存中存儲/緩存每個頁面?

附加在我的評論是兩個屏幕截圖的問題。第二個是我在XMLHttpRequest循環中設置斷點的地方,看起來右邊的「closure」面板中有一個循環引用。任何人都看到這個問題?

我能做些什麼來深入挖掘並獲得更多信息?

在此先感謝!

+0

Chrome快照:http://i55.tinypic.com/fuyzaw.png – Lemtronix 2010-10-05 14:02:01

+0

這是Chrome的開發者工具的另一個屏幕快照。我在XMLHttpRequest循環中設置了一個斷點,看起來右邊的「閉包」面板中有一個循環引用。 http://i54.tinypic.com/qyzprt.png – Lemtronix 2010-10-05 18:29:11

回答

1

有一個Google代碼項目創建了一個跨瀏覽器實現XMLHttpRequest。他們還保留一個可能對你有用的小列表native XMLHttpRequest bugs

下面的錯誤似乎可能適用於您的情況:

錯誤:XMLHttpRequest的的情況下沒有得到垃圾回收的情況下, 你必須實例 或到其他[原文]參考COM對象(對於 示例:DOM節點等)在其 onreadystatechange處理程序中,因此 會產生運行時內存泄漏。

+0

感謝您的信息,克里斯!這看起來非常有幫助。我計劃在未來幾周內實施新圖書館。現在我已經脫離了這個項目,但我會以我的結果作出迴應。 – Lemtronix 2010-10-07 14:03:19