js垃圾回收機(jī)制和引起內(nèi)存泄漏的操作

Js具有自動垃圾回收機(jī)制丝里。垃圾收集器會按照固定的時(shí)間間隔周期性的執(zhí)行。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

JS中最常見的垃圾回收方式是標(biāo)記清除

工作原理:是當(dāng)變量進(jìn)入環(huán)境時(shí),將這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”。當(dāng)變量離開環(huán)境時(shí)刘离,則將其標(biāo)記為“離開環(huán)境”室叉。標(biāo)記“離開環(huán)境”的就回收內(nèi)存。

工作流程:

1.????垃圾回收器硫惕,在運(yùn)行的時(shí)候會給存儲在內(nèi)存中的所有變量都加上標(biāo)記太惠。

2.????去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。

3.????再被加上標(biāo)記的會被視為準(zhǔn)備刪除的變量疲憋。

4.????垃圾回收器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收他們所占用的內(nèi)存空間梁只。

引用計(jì)數(shù)?方式

工作原理:跟蹤記錄每個(gè)值被引用的次數(shù)缚柳。

工作流程:

1.????聲明了一個(gè)變量并將一個(gè)引用類型的值賦值給這個(gè)變量,這個(gè)引用類型值的引用次數(shù)就是1搪锣。

2.????同一個(gè)值又被賦值給另一個(gè)變量秋忙,這個(gè)引用類型值的引用次數(shù)加1.

3.????當(dāng)包含這個(gè)引用類型值的變量又被賦值成另一個(gè)值了,那么這個(gè)引用類型值的引用次數(shù)減1.

4.????當(dāng)引用次數(shù)變成0時(shí)构舟,說明沒辦法訪問這個(gè)值了灰追。

5.????當(dāng)垃圾收集器下一次運(yùn)行時(shí),它就會釋放引用次數(shù)是0的值所占的內(nèi)存狗超。

但是循環(huán)引用的時(shí)候就會釋放不掉內(nèi)存弹澎。循環(huán)引用就是對象A中包含另一個(gè)指向?qū)ο驜的指針,B中也包含一個(gè)指向A的引用努咐。

因?yàn)镮E中的BOM苦蒿、DOM的實(shí)現(xiàn)使用了COM,而COM對象使用的垃圾收集機(jī)制是引用計(jì)數(shù)策略渗稍。所以會存在循環(huán)引用的問題佩迟。

解決:手工斷開js對象和DOM之間的鏈接。賦值為null竿屹。IE9把DOM和BOM轉(zhuǎn)換成真正的JS對象了报强,所以避免了這個(gè)問題。

什么情況會引起內(nèi)存泄漏拱燃?

雖然有垃圾回收機(jī)制但是我們編寫代碼操作不當(dāng)還是會造成內(nèi)存泄漏秉溉。

1.????意外的全局變量引起的內(nèi)存泄漏。

原因:全局變量扼雏,不會被回收坚嗜。

解決:使用嚴(yán)格模式避免。

2.????閉包引起的內(nèi)存泄漏

原因:閉包可以維持函數(shù)內(nèi)局部變量诗充,使其得不到釋放苍蔬。

解決:將事件處理函數(shù)定義在外部,解除閉包,或者在定義事件處理函數(shù)的外部函數(shù)中蝴蜓,刪除對dom的引用碟绑。

3.????沒有清理的DOM元素引用

原因:雖然別的地方刪除了俺猿,但是對象中還存在對dom的引用

解決:手動刪除。

4.????被遺忘的定時(shí)器或者回調(diào)

原因:定時(shí)器中有dom的引用格仲,即使dom刪除了押袍,但是定時(shí)器還在,所以內(nèi)存中還是有這個(gè)dom凯肋。

解決:手動刪除定時(shí)器和dom谊惭。

5.????子元素存在引用引起的內(nèi)存泄漏

原因:div中的ul li? 得到這個(gè)div,會間接引用某個(gè)得到的li侮东,那么此時(shí)因?yàn)閐iv間接引用li圈盔,即使li被清空,也還是在內(nèi)存中悄雅,并且只要li不被刪除驱敲,他的父元素都不會被刪除。

解決:手動刪除清空宽闲。

什么放在內(nèi)存中众眨?什么不放在內(nèi)存中?

基本類型是:Undefined/Null/Boolean/Number/String

基本類型的值存在內(nèi)存中容诬,被保存在棧內(nèi)存中娩梨。從一個(gè)變量向另一個(gè)變量復(fù)制基本類型的值,會創(chuàng)建這個(gè)值的一個(gè)副本放案。

引用類型:object

引用類型的值是對象姚建,保存在堆內(nèi)存中。

1.????包含引用類型值的變量實(shí)際上包含的并不是對象本身吱殉,而是一個(gè)指向該對象的指針掸冤。從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值,復(fù)制的其實(shí)是指針友雳,因此兩個(gè)變量最終都指向同一個(gè)對象稿湿。

2.????js不允許直接訪問內(nèi)存中的位置,也就是不能直接訪問操作對象的內(nèi)存空間押赊。在操作對象時(shí)饺藤,實(shí)際上是在操作對象的引用而不是實(shí)際的對象。

棧和堆的區(qū)別

一流礁、堆椞樗祝空間分配區(qū)別:

1、棧(操作系統(tǒng)):由操作系統(tǒng)自動分配釋放 神帅,存放函數(shù)的參數(shù)值再姑,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧找御;

2元镀、堆(操作系統(tǒng)): 一般由程序員分配釋放绍填,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收栖疑,分配方式倒是類似于鏈表讨永。

二、堆棧緩存方式區(qū)別:

1遇革、棧使用的是一級緩存卿闹, 他們通常都是被調(diào)用時(shí)處于存儲空間中,調(diào)用完畢立即釋放萝快;

2比原、堆是存放在二級緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)杠巡。所以調(diào)用這些對象的速度要相對來得低一些。

三雇寇、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:

堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹氢拥,如:堆排序;

棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)锨侯。

歡迎工作一到五年的Java工程師朋友們加入Java架構(gòu)開發(fā):855801563

本群提供免費(fèi)的學(xué)習(xí)指導(dǎo)?架構(gòu)資料?以及免費(fèi)的解答

不懂得問題都可以在本群提出來?之后還會有職業(yè)生涯規(guī)劃以及面試指導(dǎo)

同時(shí)大家可以多多關(guān)注一下小編 純干貨?大家一起學(xué)習(xí)進(jìn)步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫩海,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囚痴,更是在濱河造成了極大的恐慌叁怪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件深滚,死亡現(xiàn)場離奇詭異奕谭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痴荐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門血柳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人生兆,你說我怎么就攤上這事难捌。” “怎么了鸦难?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵根吁,是天一觀的道長。 經(jīng)常有香客問我合蔽,道長击敌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任辈末,我火速辦了婚禮愚争,結(jié)果婚禮上映皆,老公的妹妹穿的比我還像新娘。我一直安慰自己轰枝,他們只是感情好捅彻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞍陨,像睡著了一般步淹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诚撵,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天缭裆,我揣著相機(jī)與錄音,去河邊找鬼寿烟。 笑死澈驼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筛武。 我是一名探鬼主播缝其,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼徘六!你這毒婦竟也來了内边?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤待锈,失蹤者是張志新(化名)和其女友劉穎漠其,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竿音,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡和屎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了春瞬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眶俩。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖快鱼,靈堂內(nèi)的尸體忽然破棺而出颠印,到底是詐尸還是另有隱情,我是刑警寧澤抹竹,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布线罕,位于F島的核電站,受9級特大地震影響窃判,放射性物質(zhì)發(fā)生泄漏钞楼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一袄琳、第九天 我趴在偏房一處隱蔽的房頂上張望询件。 院中可真熱鬧燃乍,春花似錦、人聲如沸宛琅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘿辟。三九已至舆瘪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間红伦,已是汗流浹背英古。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昙读,地道東北人召调。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蛮浑,于是被迫代替她去往敵國和親某残。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容