2025-03-01-當我 URL.createObjectURL(...) 後,如果**沒有呼叫 URL.revokeObjectURL(...)釋放記憶體**,會發生什麼事?

2025-03-01-當我 URL.createObjectURL(…) 後,如果沒有呼叫 URL.revokeObjectURL(…)釋放記憶體,會發生什麼事?

你問的是:

當我 URL.createObjectURL(...) 後,如果沒有呼叫 URL.revokeObjectURL(...) 釋放記憶體,會發生什麼事?


🔍 答案:

如果你**沒有呼叫 URL.revokeObjectURL()**:

  • 程式仍然能正常執行,不會立即報錯。

  • ❗️這個 URL 會一直佔用記憶體中的一段暫存空間(Blob 資料)

  • 🧠 如果你 頻繁建立新的 Blob URLs 而不釋放它們,就會:

    • 增加記憶體使用量(memory leak)
    • 造成 瀏覽器效能變差,甚至卡頓或崩潰
    • 特別在長時間執行的 SPA(如 Vue、React 應用)或遊戲中更嚴重

🧪 小比喻:

就像你拿到一瓶飲料(Blob URL),喝完了,但不丟垃圾桶(不呼叫 revokeObjectURL()),堆久了,桌上就亂七八糟,桌面越來越擠,最後你自己沒地方用。


✅ 建議用法:

1
2
3
4
const url = URL.createObjectURL(blob)

// 用完後,例如檔案下載完,就要釋放
URL.revokeObjectURL(url)

👉 通常你在 a.click() 下載後立即釋放即可。


🧠 小結:

問題 結果
不呼叫 revokeObjectURL() 程式可跑,但記憶體可能會累積泄漏
呼叫 revokeObjectURL() 釋放記憶體,最佳實務,推薦 ✅

如你要開發一個需要常常建立暫存檔案 URL 的應用(例如:多圖上傳預覽、CSV 下載等),一定要養成 revokeObjectURL() 的習慣