繁体   English   中英

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

[英]Automatic web-page refresh memory leak using 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" }

这看起来像代码中的“ closures”问题吗?

使用Chrome中的开发人员工具(Ctrl-Shift-J),我注意到应该对ParameterValues.json文件(大小为350B)进行多次调用,因为这是存储微控制器值的JSON对象; 但是浏览器是否以某种方式将每个页面存储/缓存在内存中?

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

我该怎么做才能更深入地获取更多信息?

提前致谢!

有一个Google Code项目已经创建了XMLHttpRequest的跨浏览器实现。 他们还维护了一小列可能对您有用的XMLHttpRequest本机错误

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

错误:如果在onreadystatechange处理程序中对该实例或其他[sic] COM对象(例如DOM Node等)的引用,则XMLHttpRequest实例不会被垃圾回收,从而导致运行时内存泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM