摘要:內存泄漏是指我們已經無法再通過代碼來引用到某個對象,但垃圾回收器卻認為這個對象還在被引用,因此在回收的時候不會釋放它。
JS內存泄露
當我們用JS代碼創建一個引用類型的時候(以下簡稱對象),JS引擎會在內存中開辟一塊空間來存放數據,并把指針引用交給那個變量。內存是有限的,JS引擎必須保證當開辟的對象沒用的時候,把所分配的內存空間釋放出來,這個過程叫做垃圾回收,負責回收的叫做垃圾回收器。
內存泄漏是指我們已經無法再通過JS代碼來引用到某個對象,但垃圾回收器卻認為這個對象還在被引用,因此在回收的時候不會釋放它。導致了分配的這塊內存永遠也無法被釋放出來。如果這樣的情況越來越多,會導致內存不夠用而系統崩潰。
以下幾種情況會導致內存泄露
綁定事件沒有移除當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在內存泄露。
下面這種情況,我們移除input元素之后,但其綁定的事件仍在,垃圾回收器會認為這個對象還是有用的,因此不會回收這個對象,這樣就導致當初為這個對象分配的內存無法被釋放。
為了避免這種情況的發生,我們可以這樣寫
innerHTML將對象置為空
用innerHTML將對象置為空時,如果其中的元素被其他引用,也會發生內存泄漏。
盡管我們將div的innerHTML賦值為空,但因為引用p指向div中的p元素,這時垃圾回收器會認為p是有用的,因為被引用著,所以不會回收p占用的內存,導致內存泄漏。
閉包innerHTML
閉包的重要作用之一就是保持狀態
正常情況下,一個函數運行結束,其內部的變量就應該被釋放。但下面的情況是,函數outer返回一個匿名函數,這個函數引用變量obj。這樣導致函數outer運行結束后,它的變量obj并沒有被釋放。
function outer(){ var obj = {name:"xiaoxiong"}; return function(){ console.log(obj); } }意外的全局變量
你可以通過加上"use strict"啟用嚴格模式來避免這類問題, 嚴格模式會阻止你創建意外的全局變量
函數運行結束,變量仍然存在,導致泄漏。
function work() { bar = "this is a hidden global variable"; } // 上面的函數等價于 function work(arg) { window.bar = "this is an explicit global variable"; }
現在我們總結一下,導致內存泄漏的原因大致可以分為兩種
函數運行結束,其內部的變量仍存在
我們刪除元素,但元素在內存中仍然存在
導致這兩種情況的根本原因就是有其他變量引用這些元素。讓垃圾回收器認為這個元素還是有用的,因此想避免內存泄漏,我們應該, 要刪除一個元素,就要保證在刪除這個元素之前,這個元素不被其他其他元素引用(將引用這個元素的指針指向其他元素或置空)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84212.html
摘要:前言內存泄漏指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。這里就講一些常見會帶來內存泄露的原因。解決方案和都設為。 前言 內存泄漏指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。內存泄漏并非指內存在物理上的消失,而是應用程序分配某段內存后,由于設計錯誤,導致在釋放該段內存之前就失去了對該段內存的控制,從而造成了內存的浪費。這里就講一些常見會帶來內存泄露的原因。 0. 全局變量...
摘要:在前端項目端中,內存泄露的定位往往比修復更加困難,即使瀏覽器有提供工具,但是面對成千上萬的元素和錯綜復雜的引用關系,開發則依然很難快速定位到問題代碼塊。 在前端項目(PC端)中,內存泄露的定位往往比修復更加困難,即使google瀏覽器有提供Memory工具,但是面對成千上萬的元素和錯綜復雜的引用關系,開發則依然很難快速定位到問題代碼塊。 一、什么是內存泄漏?系統進程不再用到的內存,沒有...
摘要:在前端項目端中,內存泄露的定位往往比修復更加困難,即使瀏覽器有提供工具,但是面對成千上萬的元素和錯綜復雜的引用關系,開發則依然很難快速定位到問題代碼塊。 在前端項目(PC端)中,內存泄露的定位往往比修復更加困難,即使google瀏覽器有提供Memory工具,但是面對成千上萬的元素和錯綜復雜的引用關系,開發則依然很難快速定位到問題代碼塊。 一、什么是內存泄漏?系統進程不再用到的內存,沒有...
閱讀 2612·2021-11-02 14:39
閱讀 4331·2021-10-11 10:58
閱讀 1458·2021-09-06 15:12
閱讀 1843·2021-09-01 10:49
閱讀 1333·2019-08-29 18:31
閱讀 1886·2019-08-29 16:10
閱讀 3342·2019-08-28 18:21
閱讀 875·2019-08-26 10:42