blob URLは早期returnする全分岐でrevokeしないとメモリリークする
JavaScript
フロントエンド
メモリ管理
URL.createObjectURL()で作ったblob URLは、所有権が移った後に処理を打ち切る分岐(stale判定による早期return等)でもrevokeObjectURL()を呼ばないとGCされずメモリリークする。特に非同期処理(Promiseのthen内)で"処理開始時のセッションIDと現在のセッションIDが変わっていたら早期return"のようなキャンセル系分岐は漏れやすい。
対策:
- 早期returnの直前で、その分岐が握っている全blob URLをrevokeする
- 先行分と追加分など複数の配列がある場合は[...a, ...b]のように結合して一括revokeし、通常分岐とキャンセル分岐で同じデータ参照を対称に扱う
- 高解像度画像blobは数MB×枚数になり、モバイルブラウザでは容易に数十MBに達してタブリロードを誘発するため影響が大きい