JavaScript - 垃圾回收機(jī)制GC - 小四@王云飛

function sf() {
    var num = 0
    return function inner() {
      console.log(num)
    }
    inner()
  }

  var fn = sf()
  fn()
  fn()
  fn()

把一個(gè)內(nèi)部的函數(shù)枫匾,通過return的形式,拿到了全局范圍谴忧,然后就變成了全局函數(shù)角虫。本來num是一個(gè)局部變量,本來它被用完了應(yīng)該被清理均驶,但是現(xiàn)在不清理枫虏,這個(gè)num變量會(huì)一直存在,一直到全部的調(diào)用都消失了腾它,才會(huì)清理死讹。

這種情況就涉及到了垃圾回收機(jī)制的問題

畫圖說明更直觀:

垃圾回收機(jī)制 - 王云飛

去餐廳吃飯赞警,吃完飯餐桌肯定弄的亂七八糟稀并。
一種情況是按照要求单默,所有吃完飯的人忘瓦,走之前你必須給我把桌子給我收拾干凈,不然不能走境蜕。
另一種凌停,你盡管吃,別管多亂台诗,吃完你就走赐俗,旁邊會(huì)有一個(gè)專門負(fù)責(zé)打掃衛(wèi)生的保潔,然后他沒事就在這里轉(zhuǎn)悠粱快,她發(fā)現(xiàn)這個(gè)桌子吃完了叔扼,然后清理掉。這個(gè)充當(dāng)?shù)木褪抢厥掌鞯慕巧⒃邸:喎Q為GC食呻。
很顯然它是自動(dòng)的不用你管我們的JS也是這樣的,所以當(dāng)一個(gè)變量沒有用清理的時(shí)候你不必?fù)?dān)心每辟,該清理的時(shí)候自然就清理了干旧。

垃圾回收機(jī)制的常見算法

引用計(jì)數(shù)法(瀏覽器):

用的較多
計(jì)數(shù)法的意思就是給每個(gè)變量貼標(biāo)簽,只要有一個(gè)人用我就給他寫個(gè)數(shù)字:1挠将,兩個(gè)人用我就寫:2,三個(gè)人用就是:3乳丰;其中有一個(gè)人不用了我可以把技術(shù)撤掉内贮,把3改回2∈惭啵總之就是上面有個(gè)數(shù)字竞端,代表幾個(gè)人在使用。
這對于GC來說就簡單了事富,它巡視查看內(nèi)存的時(shí)候只要看這個(gè)變量的計(jì)數(shù)是不是等于0技俐,如果等于0毫不猶豫的清理掉,不等于0說明還有人在使用就不能清理统台。
這種方式容易產(chǎn)生很多碎片虽另,有些空間能用有些被占用了,不會(huì)連續(xù)饺谬,我們說硬盤里時(shí)不時(shí)要做碎片整理捂刺,就是為了讓我們硬盤空間利用效率更高,所以說最好就是時(shí)不時(shí)的把空間規(guī)整一下募寨,排個(gè)序族展。

復(fù)制整理法(Java內(nèi)存管理):

不停在用,整個(gè)過程都不清理拔鹰。一口氣把所有的已經(jīng)占用對的空間復(fù)制一遍,它在整個(gè)復(fù)制的過程中把所有的內(nèi)存掃描了一遍列肢,復(fù)制的時(shí)候把沒用的清理了恰画,而且做了重新排序。
缺點(diǎn):你的內(nèi)存必須得一分為二瓷马,可能有一半空間不能利用拴还。如果你內(nèi)存大不在乎,這種方式是不錯(cuò)的選擇

標(biāo)記清除法(瀏覽器):

用的不多
不停的增加欧聘,每隔一段時(shí)間就使勁的掃描內(nèi)存片林,并且清理,過一段時(shí)間再掃描,和引用計(jì)數(shù)法一樣费封,同樣會(huì)存在碎片

標(biāo)記整理法(瀏覽器):

用的較多
當(dāng)變量越來越多的時(shí)候焕妙,它也會(huì)定期的進(jìn)行掃描,掃描完了它從頭到尾做了一個(gè)排序弓摘,一邊清除焚鹊,一邊排序,工作量蠻大的

閉包中的變量num為什么不會(huì)被回收韧献?

明白了垃圾回收機(jī)制寺旺,那么閉包中的num為什么不會(huì)被回收,應(yīng)該就可以解釋了吧势决!外面的全局函數(shù)還在使用num,因此num身上有計(jì)數(shù)蓝撇,不為零果复,所以它不會(huì)被清除。

內(nèi)存泄漏常見情況

  • 閉包寫多了就會(huì)造成內(nèi)存泄漏渤昌,一般不可能代碼里全是閉包虽抄,我們只能說有這個(gè)風(fēng)險(xiǎn)
  • 大量的使用全局變量,現(xiàn)在基本不會(huì)出現(xiàn)独柑,因?yàn)槲覀儸F(xiàn)在都模塊化了迈窟,全局變量很少用
  • 定時(shí)器,這個(gè)可能性大一些忌栅,我們總是開啟了就忘記了關(guān)閉车酣,經(jīng)常犯
  • DOM元素的引用:
<body>
  <button id = 'btn'>按鈕</button>
</body>
<script>
  var btn = document.getElementById('btn')
  btn.remove() // 這個(gè)按鈕就不會(huì)出現(xiàn)在頁面上了

  // 但是你在控制臺(tái)(console.log())輸入btn ,結(jié)果就是還有
 // 為什么還有索绪?
 //  頁面是不存在了湖员,但是頁面上還有
 // 就是因?yàn)槿肿兞?btn ,btn.remove刪除了節(jié)點(diǎn)瑞驱,但是它就還被保留在內(nèi)存當(dāng)中
 //解決方案:
</script>

解決方案

btn = null // 現(xiàn)在被釋放了

大前端面試題庫 - 2019.08.06

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娘摔,一起剝皮案震驚了整個(gè)濱河市唤反,隨后出現(xiàn)的幾起案子凳寺,更是在濱河造成了極大的恐慌,老刑警劉巖彤侍,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肠缨,死亡現(xiàn)場離奇詭異,居然都是意外死亡盏阶,警方通過查閱死者的電腦和手機(jī)怜瞒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吴汪,你說我怎么就攤上這事惠窄。” “怎么了漾橙?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵杆融,是天一觀的道長。 經(jīng)常有香客問我霜运,道長楚里,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任立宜,我火速辦了婚禮舆瘪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焦除。我一直安慰自己激况,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布膘魄。 她就那樣靜靜地躺著乌逐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪创葡。 梳的紋絲不亂的頭發(fā)上浙踢,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音灿渴,去河邊找鬼洛波。 笑死,一個(gè)胖子當(dāng)著我的面吹牛骚露,可吹牛的內(nèi)容都是我干的奋岁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼荸百,長吁一口氣:“原來是場噩夢啊……” “哼闻伶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起够话,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤蓝翰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后女嘲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畜份,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年欣尼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爆雹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片停蕉。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钙态,靈堂內(nèi)的尸體忽然破棺而出慧起,到底是詐尸還是另有隱情,我是刑警寧澤册倒,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布蚓挤,位于F島的核電站,受9級(jí)特大地震影響驻子,放射性物質(zhì)發(fā)生泄漏灿意。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一崇呵、第九天 我趴在偏房一處隱蔽的房頂上張望缤剧。 院中可真熱鬧,春花似錦域慷、人聲如沸荒辕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至大溜,卻和暖如春化漆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钦奋。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工座云, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人付材。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓朦拖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厌衔。 傳聞我的和親對象是個(gè)殘疾皇子璧帝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,105評(píng)論 1 32
  • 1. 垃圾回收的意義在C++中,對象所占的內(nèi)存在程序結(jié)束運(yùn)行之前一直被占用富寿,在明確釋放之前不能分配給其它對象睬隶;而在...
    愛情小傻蛋閱讀 935評(píng)論 0 11
  • 什么是垃圾回收機(jī)制? 和java页徐,c#一樣苏潜,javascript也有垃圾回收的機(jī)制,比如說c++和c就沒有垃圾回收...
    我向你奔閱讀 478評(píng)論 0 1
  • 1变勇、什么是垃圾回收恤左? 程序的運(yùn)行必然需要申請內(nèi)存資源,無效的對象資源如果不及時(shí)處理就會(huì)一直占有內(nèi)存資源,最終將導(dǎo)致...
    JavaLover閱讀 877評(píng)論 0 1
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理飞袋,因此不免有一些不準(zhǔn)確的地方戳气,同時(shí)不同JDK版本的...
    高廣超閱讀 15,614評(píng)論 3 83