2

Firefox を数時間使用した後、RAM メモリが 2GB を超えていることに気付きました。これは、ajax アップローダーを使用して大きなファイル (100mb ~ 400mb) をアップロードするときに特に発生し、多くの画像 (たとえば、Web ページの合計画像が 16MB) を開くときにも発生します。

問題は、アップロードが完了した後、または画像ページを閉じた後でもメモリが解放されないことです.Firefoxにはまだ2GBのRAMメモリがあります. アップロードが終了したとき、または画像がロードまたは閉じられた後など、javascriptからFirefoxのメモリを解放する方法はありますか?

EDIT From about:memory: 1,172.03 MB (100.0%) -- 明示的

├──1,000.00MB (85.32%) -- js

│ ├────863.97MB (73.72%) -- コンパートメント([システムプリンシパル], 0x5083000)

│ │ ├──819.31 MB (69.91%) ── string-chars

ファイルがメモリに読み込まれ、ajax でアップロードされたときに来ると確信しているstring-charsを空にするにはどうすればよいですか?

編集2

このメモリ使用量を引き起こす再帰関数は次のとおりです。

function uploadAjax(file, startByte, index)
{
    if(startByte==0)
    {
        $('#progress'+index).html(' ').progressbar( "destroy" ).progressbar();
        $('#asyncuploadsingle'+index).attr('disabled', true);
    }

    var size        = file.size;
    var chunkSize   = 2097152;//2 megabyte
    var endByte     = chunkSize + startByte;
    var isLast      = (size - endByte <= 0);
    var chunk       = file;
    var xhr         = new XMLHttpRequest();//prepare xhr for upload
    var chunkNum    = endByte / chunkSize;

    if(chunkSize == 0)//no divide
    {
        chunk   = file;
        isLast  = true;
    }
    else if(file.mozSlice) // moz slice
    {
        chunk   = file.mozSlice(startByte, endByte);
    }
    else if(file.webkitSlice) //webkit slice
    {
        chunk   = file.webkitSlice(startByte, endByte);
    }
    else if(file.slice) // w3c slice
    {
        chunk   = file.slice(startByte, chunkSize);
    }
    else
    {
        chunk   = file;
        isLast  = true;
    }

    //progress function, with ajax upload progress can be monitored
    xhr.upload.addEventListener('progress', function(e)
    {
        if (e.lengthComputable) 
        {
            var perc = Math.round((e.loaded + chunkNum * chunkSize - chunkSize) * 100 / size);
            //console.log(perc+':'+index);
            $('#progress'+index).progressbar("option", "value", perc);
        }  
    }, false); 

    xhr.upload.onabort=function(e)  {   
        finishUp(index,'Aborted');
    };  

    xhr.upload.addEventListener('error', function(e){
        finishUp(index, this.responseText+'--->'+name);
    }, false);  

    xhr.onreadystatechange=function()
    {
        if(this.readyState == 4 && this.status == 200)
        {
            try
            {
                var ret = JSON.parse(this.responseText);

                if(isLast)
                {
                    finishUp(index,'');
                }
                else if(ret.status == 'error')
                {
                    throw ret.info;
                }
                else
                {
                    uploadAjax(file, endByte, index);
                }
            }
            catch(err)
            {
                finishUp(index, err);
            }

            delete chunk;
        }
    };

    var path    = get_final_path();
    var url     = "filetransfer/uploadfiles.php?ax-file-name="+encodeURIComponent(file.name)+"&ax-file-path="+encodeURIComponent(path)+'&ax-start-byte='+startByte;

    xhr.open("POST", url, true);
    xhr.setRequestHeader('Cache-Control', 'no-cache');
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//header
    xhr.setRequestHeader('Content-Type', 'application/octet-stream');//generic stream header

    /*var reader = new FileReader();
    reader.onload = function(evt) {  
        xhr.sendAsBinary(evt.target.result);  
    };  
    reader.readAsBinaryString(chunk);
    */  
    xhr.send(chunk);

    return xhr;
}

それを最適化する場所、またはオブジェクトを解放する場所はありますか?

4

4 に答える 4

2

Firefox のメモリを最小限に抑えるために、Memoryfox アドオンを使用しています。Photoshop / Lightroomを頻繁に実行し、すべてのプロセスモードでそれらに干渉する傾向があるため(「すべてのプロセス」オプションを有効にしないでください)、ブラウザーにのみ使用します(非常に積極的です)。

メモリーフォックス

そのFirefoxを使用しても、まだ膨らみます。最善の方法は、使用しないアドオンを削除し、頻繁に使用しないアドオンを無効にすることです。多くのプラグインがある場合、Firefox で重大なメモリの問題を引き起こすプラグインがいくつかあり、それらのいくつかはMemShrink プロジェクトの下で強調表示されます。

編集で提供されたコードを具体的に参照すると、追加のメモリ使用量が表示される理由がいくつかあります。

1) 匿名関数の使用は、uploadAjax が実行されるたびに、新しい関数がメモリ内に作成されることを意味します。関数を uploadAjax の外部で定義してから参照し、メモリ内での重複を回避します。

2)delete xhr;使い終わったら。通常は必要ありませんが、大量のアップロードを実行している場合は、いくつかのものが残っている可能性があります.

3) 基本的uploadAjax(file, endByte, index);に、再帰的かつ匿名関数内で呼び出しています。つまり、上位レベルの呼び出しで作成したものはすべて、下位レベルの呼び出しが実行されている間も存在する可能性があります。これにより、複数のインメモリxhrchunk. 別の方法で呼び出すことを検討してくださいuploadAjax(イベントをトリガーしてからグローバルから同じファイルと xhr にアクセスするか、実行の切断を導入するために短いタイマーでアクセスするなど)。確かに言うのは難しいですが、おそらく前者を好むでしょう。自分でテストせずに)。

于 2012-07-02T14:07:59.333 に答える
1

それはあなたが望むものではありませんが、これが必要なもののようです:

https://addons.mozilla.org/en-US/firefox/addon/memory-restart/

アラートのしきい値を設定し、自動再起動することもできます。

(ただし、Rob W のおかげで発見したabout:memoryように、ガベージ コレクションやその他のメモリ クリーンアップを行うことができます (少なくとも Firefox 13 では、以前のバージョンの Firefox を使用していないため、それがどれだけ前のものかは確認していません)。 Firefoxの自動再起動がうまくいかない場合は、自動でなくても最初にそれを試してみることをお勧めします.好み。)

于 2012-07-02T14:04:17.350 に答える
0

これは、Firefox の背後で起こっている最悪の事態です... 私もこの問題を抱えていました。問題は、ブラウザを再起動する必要があるため、一部のメモリが解放されますが、すべてではありません。主にページを更新せずに dom 置換を使用する One Page Application の主な問題です。

于 2012-07-02T14:09:22.453 に答える
0

Firefox には、問題の解決に役立つ JavaScript API がありません。Firefox のメモリ使用量は、フットプリントを改善するための多くの作業にもかかわらず、最も長く続いている苦情の 1 つです。オプションは主に次のように制限されています。

(a) プロセスを強制終了し、割り当てられたメモリを解放するために、Firefox を再起動する

(b) Firefox または Windows 用のサードパーティのユーティリティまたはプラグインを使用して、メモリの一部を解放する

(c) メモリ使用量の問題を軽減するのに役立つタブごとのプロセス モデルを使用する Chrome などの別のブラウザを使用する

参考までに -ここに Mozilla ナレッジベースからの詳細情報があります

于 2012-07-02T14:22:00.123 に答える