JavaScript之記憶體溢位和記憶體洩漏

wade3po發表於2019-03-15

記憶體溢位:

程式執行出現的錯誤,就像水杯,滿了之後再加水就溢位了。同理,記憶體溢位就是程式執行所需的記憶體大於可用記憶體,就出現記憶體溢位錯誤。

最簡單的就是寫一個千萬級別的迴圈,然後用瀏覽器開啟,瀏覽器會非常卡,甚至直接報錯記憶體不足,崩潰了。不同瀏覽器會有不同的表現。

記憶體溢位一般是記憶體洩漏造成的,佔用的記憶體不需要用到了但是沒有及時釋放,記憶體洩漏積累的多了輕的話影響系統效能,嚴重直接引起記憶體溢位系統崩潰。記憶體洩漏一般有下面幾個:

全域性變數引起的記憶體洩漏:

根據JavaScript的垃圾回收機制我們知道,全域性變數是不會被回收的,所以一些意外的、不需要的全域性變數多了,沒有釋放,就造成了記憶體洩漏。

閉包:

閉包其實也是跟全域性變數掛鉤了,但是閉包只是因為被全域性變數引用了,內部的變數因為被閉包引用得不到釋放,也會造成記憶體洩漏。

計時器、回撥、監聽等事件沒有移除:

計時器、回撥、事件監聽等沒有清除是一直存在的,一直存在沒有被釋放就會造成記憶體洩漏。

給DOM新增屬性或方法:

給DOM新增點選方法、新增屬性等,也會造成變數引用得不到釋放,造成記憶體洩漏。

這是現在能找到的最基礎的造成記憶體洩漏的幾個點,應該還有更深層次一點的。而記憶體洩漏最核心的還是因為垃圾機制,全域性變數或者是被全域性變數引用,垃圾機制就無法回收,要是一直需要使用的還好,要是一些用完一次就不再使用的沒有釋放,那麼積累的多了就容易造成記憶體溢位。

歡迎關注Coding個人筆記訂閱號

相關文章