Утечка памяти от SAJAX

   Здравствуйте.  У меня есть такая задача: На странице отображать 12 параметров(параметры хранятся в БД на сервере). Обновлять эти параметры нужно с периодичностью 1 раз в секунду. Для реализации такой страницы я использую библиотеку SAJAX. На первый взгляд все работает. Но! Смотрю в диспетчер задач на вкладку процессы и вижу: процесс моего браузера (IE)  постоянно ест память, примерно по 300 kb в секунду. Пробовал другие браузеры : Opera, FireFox - результат тот же самый. Естественно, с такой утечкой памяти браузер долго работать не может. А мне нужно, чтобы браузер работал с подобной страницей полный рабочий день - т.е 8 часов подряд.  Мои вопросы:  1) Правильно ли я выбрал средства реализации для моей задачи, я имею в виду библиотеку SAJAX ?  2) Каким образом можно обновлять данные на странице без утечки памяти?  Заранее спасибо.
3 ответа

cir, вы, помоему, уже создавали подобную тему...Приведите js исходник того, что работает в браузере -- тогда можно будет что-то говорить.


Привожу код страницы, с которой работает браузер:
<html><head><link rel="StyleSheet" type="text/css" href="style.css"><link rel="stylesheet" type="text/css" href="prototype.js" />        <title>Show Server's Date</title>
      
  <script>                   // remote scripting library        // (c) copyright 2005 modernmethod, inc        var sajax_debug_mode = false;        var sajax_request_type = "GET";        var sajax_target_id = "";        var sajax_failure_redirect = "";                function sajax_debug(text) {            if (sajax_debug_mode)                alert(text);        }                function sajax_init_object() {            sajax_debug("sajax_init_object() called..")                        var A;                        var msxmlhttp = new Array(                'Msxml2.XMLHTTP.5.0',                'Msxml2.XMLHTTP.4.0',                'Msxml2.XMLHTTP.3.0',                'Msxml2.XMLHTTP',                'Microsoft.XMLHTTP');            for (var i = 0; i < msxmlhttp.length; i++) {                try {                    A = new ActiveXObject(msxmlhttp[i]);                } catch (e) {                    A = null;                }            }                        if(!A && typeof XMLHttpRequest != "undefined")                A = new XMLHttpRequest();            if (!A)                sajax_debug("Could not create connection object.");            return A;        }                var sajax_requests = new Array();                function sajax_cancel() {            for (var i = 0; i < sajax_requests.length; i++)                 sajax_requests[i].abort();        }                function sajax_do_call(func_name, args) {            var i, x, n;            var uri;            var post_data;            var target_id;                        sajax_debug("in sajax_do_call().." + sajax_request_type + "/" + sajax_target_id);            target_id = sajax_target_id;            if (typeof(sajax_request_type) == "undefined" || sajax_request_type == "")                 sajax_request_type = "GET";                        uri = "/sms-monitor/info_object.php?id_object=7";            if (sajax_request_type == "GET") {                            if (uri.indexOf("?") == -1)                     uri += "?rs=" + escape(func_name);                else                    uri += "&rs=" + escape(func_name);                uri += "&rst=" + escape(sajax_target_id);                uri += "&rsrnd=" + new Date().getTime();                                for (i = 0; i < args.length-1; i++)                     uri += "&rsargs[]=" + escape(args[i]);                post_data = null;            }             else if (sajax_request_type == "POST") {                post_data = "rs=" + escape(func_name);                post_data += "&rst=" + escape(sajax_target_id);                post_data += "&rsrnd=" + new Date().getTime();                                for (i = 0; i < args.length-1; i++)                     post_data = post_data + "&rsargs[]=" + escape(args[i]);            }            else {                alert("Illegal request type: " + sajax_request_type);            }                        x = sajax_init_object();            if (x == null) {                if (sajax_failure_redirect != "") {                    location.href = sajax_failure_redirect;                    return false;                } else {                    sajax_debug("NULL sajax object for user agent:\n" + navigator.userAgent);                    return false;                }            } else {                x.open(sajax_request_type, uri, true);                // window.open(uri);                                sajax_requests[sajax_requests.length] = x;                                if (sajax_request_type == "POST") {                    x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");                    x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");                }                            x.onreadystatechange = function() {                    if (x.readyState != 4)                         return;                    sajax_debug("received " + x.responseText);                                    var status;                    var data;                    var txt = x.responseText.replace(/^\s*|\s*$/g,"");                    status = txt.charAt(0);                    data = txt.substring(2);                    if (status == "") {                        // let's just assume this is a pre-response bailout and let it slide for now                    } else if (status == "-")                         alert("Error: " + data);                    else {                        if (target_id != "")                             document.getElementById(target_id).innerHTML = eval(data);                        else {                            try {                                var callback;                                var extra_data = false;                                if (typeof args[args.length-1] == "object") {                                    callback = args[args.length-1].callback;                                    extra_data = args[args.length-1].extra_data;                                } else {                                    callback = args[args.length-1];                                }                                callback(eval(data), extra_data);                            } catch (e) {                                sajax_debug("Caught error " + e + ": Could not eval " + data );                            }                        }                    }                }            }                        sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);            x.send(post_data);            sajax_debug(func_name + " waiting..");            delete x;            return true;        }                                // wrapper for show_now                function x_show_now() {            sajax_do_call("show_now",                x_show_now.arguments);        }                    function show_mein1(date_server) { document.getElementById('signal_in1').innerHTML = date_server; }               function get_date() {                x_show_now(show_mein1);                                   }    var testTimer = setInterval('get_date()', 1000);        </script>
</head><body><!-- <body  onload="get_date();" > --><p id="signal_in1" >Вход 1</p><table></table></body></html>


В IE будет течь в любом слуячае. Как я уже писал, есть известный баг с утечкой в памяти при навешивании как обработчика на ActiveX анонимной функции. Если хотите почитать подробнее -- могу дать ссылку на инглише.Добавлено через 2 минуты и 40 секундХотя тут он и в других браузерах не удаляется:
sajax_requests[sajax_requests.length] = x;
т.е. мы сохраняем каждый раз ссылку на объект, а вот удаления его по окончанию обработки я не нашел.Добавлено через 8 минут и 18 секунд
1) Правильно ли я выбрал средства реализации для моей задачи, я имею в виду библиотеку SAJAX ?
Правильно/не правильно -- бог его знает. Но я не сторонник использования таких фреймверков. Когда отдельно пишется JS и PHP, то получается более контролируемо.Лично я использую JQuery. Как там поставлен вопрос с утечкой -- не скажу, но с проблеммами не сталкивался.
2) Каким образом можно обновлять данные на странице без утечки памяти?
1. Не сохранять ссылку на объект XMLHTTPRequest или удалять ее после окончания обработки2. Не использовать анонимные функции как обработчики.