4

私のjavascriptアプリケーションでは、オブジェクトAJAXを取得するための呼び出しを行うときに大きなメモリリークが発生しJSONます。コードは本当に単純です:

function getNewMessage()
{
    new_message = []; // this is global variable
    var input_for_ball = [];
    var sum;
    var i;

    var http = new XMLHttpRequest();
    http.open("GET", url + "/random_ball.json", false);
    http.onreadystatechange = function()
    {
        if(http.readyState === 4 && http.status === 200)
        {
            var responseTxt = http.responseText;
            input_for_ball = JSON.parse('[' + responseTxt + ']');
        }
    }
    http.send(null);

    new_message = input_for_ball;
}

これは1ミリ秒ごとに呼び出され、ご覧のとおり、同期呼び出しです。この機能は1秒ごとに1MBかかります。

AJAX次のような変数に割り当てる代わりに使用する場合:

 input_for_ball = JSON.parse('[0,0,0,0,0,0,0,0,0,0]');

その後、そのすべてが完璧です。AJAXしたがって、呼び出しの実装にエラーがあるはずです。jQuery AJAXこれは私がcallを使うときにも起こりました。

2013年12月3日更新

以下で説明するように、これTom van der Woerdtは実際には意図された動作でした。提案さMatt B.れているように、非同期呼び出しを可能にするためにいくつかのコードを書き直しましたが、それは大いに役立ちました。これで、アプリケーションのメモリ消費量は安定して小さくなりました。

4

1 に答える 1

3

AJAX 呼び出しではないと思いますが、メモリを消費している閉鎖です。onreadystatechange 関数は http オブジェクトを参照します (したがって、これへの参照は匿名関数で保持されます)。

あなたのコードは、このリンクhttp://www.ibm.com/developerworks/web/library/wa-memleak/

の例 1 のパターンと一致すると思い ます読み進めてください - それらを理解すると、一見すると意味をなさないように見える多くの動作が説明されます。

于 2013-03-11T11:35:12.613 に答える