5

私は、クライアントでファイルとしてダウンロードできる巨大なブロブを作成します。JavaScriptで大きなブロブを削除する

次の例は、単に問題

var x= "sdfslkdfjklsdjiflskdflsdf" ; for(var i = 0; i<19;i++) x=x+x 
var blob = new Blob([x,x,x,x,x,x,x,x,x,x,x,x,x], { 
    type : "text/plain" 
}); 

これは、多くのメモリを使用するに実証することです。 ブロブ私はそのメモリを解放したいと思います。 私はすでにblob = nullの設定やdelete blobを使用してみました(私はIE11エッジでこれをテストしています)このスクリプトを実行

これ以上のメモリが

を割り当てることができないよう二度失敗し、何もに起こりません想い出。

メモリを解放するにはどうすればよいですか?

+0

「削除するBLOB」を試すことができます。 – Feathercrown

+0

すべての答えが正しいです。 Javascriptはgargabeで収集されているので、これがあなたの最良の選択肢です。より多くのメモリを制御したい場合は、サーバー側の実装に切り替えて、管理されていないコードを使用します。しかし、すべての種類の地獄のために準備してください。 – Renan

+1

'URL.createObjectURL()'メソッドを使用している場合は、オブジェクトurlが不要になったときに 'URL.revokeObjectURL()'を呼び出すことを忘れないでください。そうしないと、メモリ内で行われ、 GCしてください。 – Kaiido

答えて

1

ここに壁を打つつもりだと思います。 Javascriptはgarbage-collectedです。これは、ブラウザが時間だと思ったときに、を効果的にマークするための変数を「未設定」にすることを意味します。

魅力的なように、nullに設定すると、割り当てられたメモリはただちに解放されることはありませんが、ガベージコレクションが実際に発生した場合にのみ、含まれるオブジェクト)が存在します。

var blobA = new Blob(...); 
var blobB = blobA; 
blobA = null; 
console.log(blobB); // Blob, the object still exists 

ガベージコレクションは自動で行われ、そしてそれはJavascriptを内部から発生したときに予測または検出する方法はありません。私の知る限りそれを行うための唯一の方法が効果的であるガベージコレクションを、トリガするページ全体の完全な再読み込みを行って、正しいです

window.location.reload(); 

:しかし、それを手動でトリガするための1つの方法は、あります。アプリケーションを設計する際には、これを考慮する必要があります。

+1

['delete'を使う](http://perfectionkills.com/understanding-delete/)は明らかな選択肢ではありません。それを提案してください。 – Bergi

+0

@Bergi私は、私の答えのどの部分が、推測された_Suggestion_が(あるいは[http://stackoverflow.com/posts/37071672/revisions])であるかを見落としています。何かがある場合、含まれているコードスニペットの中で私の好みはnullingを示唆しています。 –

+0

あなたがそれに言及するとき、人々はそれが提案だと思うでしょう。それが絶対に変数では機能しないことを考えれば、ただ無視するだけです。 – Bergi

関連する問題