Автоматическая утечка памяти при обновлении веб-страницы с использованием XMLHttpRequest - PullRequest
2 голосов
/ 05 октября 2010

Привет,
Я работал над веб-интерфейсом для некоторых аппаратных средств, которые используют 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, и похоже, что на панели «замыкание» справа есть круговая ссылка.Кто-нибудь видит проблему с этим?

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

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

1 Ответ

1 голос
/ 05 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...