2016-06-14 10 views
0
function f() { 
    // some code.. then: 
    var bloburl = URL.createObjectURL(canvasToBlobOutput) 
    // I could would do the following line, but assume I don't 
    // imgElement.src = bloburl; 
    // will this leak memory? 
} 

imgElement.src行のコメントを外すと、img要素がblobオブジェクトをメモリに「フック」することがわかりました。しかし、私たちが(この行なしで)このような機能を実行すると、bloburlをGCできなかった理由は分かりません。関数の後の参照はありません。JavaScriptなぜwindow.URL.createObjectURLを取り消す必要がありますか?

+0

MDN:['URL.createObjectURL()'](https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL)静的メソッドは、そのURLを表すURLを含むDOMStringを作成します。パラメータで与えられたオブジェクト。 ** URLの有効期間は、作成されたウィンドウ内のドキュメントに関連付けられます。**ブラウザは、ドキュメントがアンロードされると自動的にこれらを解放します。ただし、最適なパフォーマンスとメモリー使用量のために、明示的にアンロードできる安全な時間がある場合は、そうする必要があります。 – Andreas

+0

これは、ウィンドウ/ドキュメントがアンロードされたときに明らかにすべてが解放されることを示しています。オブジェクトがメモリに保持されている理由を理解できないので、 – user3599803

答えて

1

文字列を操作できるので、文字列はブロブに対してGCエッジとして機能しません。したがって、BLOBは、生成されたBLOB URIからロードできるようにGCedされないようにする内部レジストリに入れなければなりません。

はとして実装隠さMapインスタンスとURL.createObjectURLことが想像:

function createObjectURL(blob) { 
    let uri = generateRandomURI() 
    window._hiddenMap.set(uri, blob) 
    return uri 
} 

誰かがURIことをロードしようとしたときに内部のマップを確認することができますこの方法。しかし、そのマップはまた、URIがそのBLOBへの唯一の残りの参照かもしれないので、BLOBを生かしておく必要があります。

gc-edgeを削除するには、URIを取り消す必要があります。

関連する問題