Утечка памяти автоматического обновления веб-страницы с использованием XMLHttpRequest

Приветствую,
Я работаю над веб-интерфейсом для некоторого оборудования, использующего 8-битный микроконтроллер. Веб-страница использует для связи HTML, javascript, JSON и XHR (XMLHttpRequest). Что я пытаюсь сделать, так это создать страницу, которая обновляется каждые 250 мс новыми значениями из контроллера с использованием setInterval, чтобы веб-страница обновлялась «в режиме реального времени», чтобы она больше походила на приложение для пользователя.

Я заставил его работать по большей части, но обнаружил, что где-то в коде есть утечка памяти с обоими браузерами, которые я тестировал, 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 (размер 350 байт), как и должно быть, поскольку это объект JSON, в котором хранятся значения из микроконтроллера; но браузер каким-то образом хранит/кэширует каждую страницу в памяти?

К моему комментарию прикреплены два скриншота проблемы. Во втором случае я устанавливаю точку останова в цикле XMLHttpRequest, и похоже, что на панели «закрытие» справа есть циклическая ссылка. Кто-нибудь видит проблему с этим?

Что я могу сделать, чтобы копнуть глубже и получить больше информации?

Заранее спасибо!


person Lemtronix    schedule 04.10.2010    source источник
comment
Снимок Chrome: i55.tinypic.com/fuyzaw.png   -  person Lemtronix    schedule 05.10.2010
comment
Вот еще один снимок экрана с инструментом разработчика Chrome. Я устанавливаю точку останова в цикле XMLHttpRequest, и похоже, что на панели закрытия справа есть циклическая ссылка. i54.tinypic.com/qyzprt.png   -  person Lemtronix    schedule 05.10.2010


Ответы (1)


Существует проект Google Code, который создал кросс-браузерную реализацию XMLHttpRequest. Они также поддерживают небольшой список собственных ошибок XMLHttpRequest, которые могут быть вам полезны.

Следующая ошибка кажется потенциально применимой к вашей ситуации:

Ошибка: экземпляр XMLHttpRequest не получает сбор мусора, если у вас есть ссылка на экземпляр или на другой [sic] COM-объект (например, узел DOM и т. д.) в его обработчике onreadystatechange, что приводит к утечкам памяти во время выполнения.

person Chris Shouts    schedule 05.10.2010
comment
Спасибо за информацию, Крис! Это выглядит очень полезным. Я планирую внедрить новую библиотеку в ближайшие несколько недель. На данный момент меня сняли с этого проекта, но я отвечу своими результатами. - person Lemtronix; 07.10.2010