使用XMLHttpRequest自动刷新网页内存泄漏

时间:2010-10-04 20:36:31

标签: javascript ajax json memory-leaks xmlhttprequest

问候,
我一直在为一些使用8位微控制器的硬件开发Web界面。该网页使用HTML,javascript,JSON和XHR(XMLHttpRequest)进行通信。我要做的是创建一个页面,使用setInterval从控制器中使用新值每250mS更新一次,以便“实时”更新网页,使其更像是对用户的应用程序。

我已经让它在大多数情况下工作,但发现代码中的内存泄漏了我测试过的两种浏览器,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大小),因为这是存储来自微控制器的值的JSON对象;但浏览器是否以某种方式存储/缓存内存中的每个页面?

在我的评论中附有两个问题的屏幕截图。第二个是在XMLHttpRequest循环中设置断点的地方,看起来在右侧的“闭包”面板中有一个循环引用。有人看到这个问题吗?

我可以做些什么来深入挖掘并获取更多信息?

提前致谢!

1 个答案:

答案 0 :(得分:1)

Google代码项目创建了XMLHttpRequest的跨浏览器实现。他们还会保留一份可能对您有用的native XMLHttpRequest bugs小列表。

以下错误似乎可能适用于您的情况:

  

错误:XMLHttpRequest的实例不会收集垃圾以防万一   你有一个对实例的引用   或者其他[原文] COM对象(for   例如:DOM节点等)   因此,onreadystatechange处理程序   产生运行时内存泄漏。