成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js回收機(jī)制

Lemon_95 / 3366人閱讀

摘要:今天總結(jié)下的回收機(jī)制。說(shuō)起的回收機(jī)制,一定要先說(shuō)的內(nèi)存分配了。為什么內(nèi)存還要區(qū)分堆內(nèi)存和棧內(nèi)存呢這里就要說(shuō)到的垃圾回收機(jī)制了。

今天總結(jié)下js的回收機(jī)制。

說(shuō)起js的回收機(jī)制,一定要先說(shuō)js的內(nèi)存分配了。

內(nèi)存分配

前端的同學(xué)們肯定知道,js的變量分為基本類型和引用類型。

基本類型
js的基本類型有String,Number,Boolean,Null,Undefined,這些變量在內(nèi)存中占用固定的空間大小,聲明之后會(huì)被分配到棧內(nèi)存中,我們是按值訪問(wèn)的。

引用類型
js的引用類型的值大小是不固定的,需要通過(guò)引用來(lái)找到相應(yīng)的值,在棧內(nèi)存中會(huì)分配空間存放引用類型在堆內(nèi)存中的地址,在堆內(nèi)存中會(huì)存放對(duì)應(yīng)的值。因?yàn)榈刂返拇笮∈枪潭ǖ模钥梢源嬖跅?nèi)存中,需要用到的時(shí)候,會(huì)到棧內(nèi)存中先找到這個(gè)引用地址,然后再在堆中找到這個(gè)值。

為什么內(nèi)存還要區(qū)分堆內(nèi)存和棧內(nèi)存呢?這里就要說(shuō)到j(luò)s的垃圾回收機(jī)制了。

為什么會(huì)有垃圾回收呢?當(dāng)然是為了使程序運(yùn)行時(shí)的內(nèi)存最小啦。

當(dāng)一個(gè)方法執(zhí)行的時(shí)候,會(huì)有部分內(nèi)存用來(lái)存方法中聲明的變量,這些變量都被存在棧內(nèi)存中,當(dāng)方法結(jié)束的時(shí)候,這個(gè)棧內(nèi)存中的變量(除了地址以外)都會(huì)被銷毀。

但是當(dāng)我們聲明一個(gè)對(duì)象的時(shí)候,這個(gè)對(duì)象在其他地方也被引用了,這個(gè)對(duì)象的大小是不固定的,會(huì)被分配到堆內(nèi)存中,隨著方法的結(jié)束,這個(gè)堆內(nèi)存也不會(huì)被銷毀,因?yàn)槠渌胤竭€在引用(方法的傳參等等),除非這個(gè)對(duì)象的引用為0,垃圾回收機(jī)制才會(huì)在核實(shí)之后銷毀他,這里就牽扯到了垃圾回收中的引用計(jì)數(shù),下面會(huì)講到。

內(nèi)存聲明周期

內(nèi)存聲明周期:

分配你所需要的內(nèi)存

使用分配到的內(nèi)存讀和寫

不需要時(shí)將其釋放

在js中,第三部分是自動(dòng)完成的,因?yàn)閖s中有自動(dòng)垃圾回收機(jī)制。在編寫js時(shí),不需要關(guān)心內(nèi)存的使用問(wèn)題,所需內(nèi)存的分配和內(nèi)存的釋放都是自動(dòng)完成的。

內(nèi)存泄漏

什么情況下會(huì)內(nèi)存泄漏?可以這么理解,就是有些代碼本來(lái)應(yīng)該要被回收的,但是沒(méi)有被回收,所以一直占用著操作系統(tǒng)的內(nèi)存,從而越積越多。一般的內(nèi)存泄漏其實(shí)無(wú)關(guān)緊要,可怕的是內(nèi)存泄漏引起的堆積,導(dǎo)致GC一直沒(méi)辦法使用所占用的內(nèi)存給其他程序使用。

內(nèi)存溢出

內(nèi)存溢出就是程序向系統(tǒng)申請(qǐng)一定大小的內(nèi)存,但是系統(tǒng)滿足不了。

管理內(nèi)存

處于安全的考慮,一般情況下系統(tǒng)給瀏覽器的內(nèi)存會(huì)比給客戶端的內(nèi)存要少,即使瀏覽器內(nèi)存泄漏了或者內(nèi)存溢出了也不會(huì)讓系統(tǒng)崩潰。內(nèi)存限制的問(wèn)題不僅會(huì)影響到給變量分配的內(nèi)存,也會(huì)影響每個(gè)線程最多能執(zhí)行的語(yǔ)句數(shù)量。

所以為了確保在有限的內(nèi)存中可以讓頁(yè)面獲得最好的性能,優(yōu)化內(nèi)存占用的最佳方式就是將其值設(shè)置為null來(lái)釋放其引用。這個(gè)方法叫做解除引用,適用于全局變量和全局對(duì)象的屬性,局部變量在離開執(zhí)行環(huán)境之后就會(huì)自動(dòng)被解除引用。

解除引用并不意味著馬上回收該值所占用的內(nèi)存,解除引用的真正作用是讓值離開執(zhí)行環(huán)境,讓GC下次運(yùn)行時(shí)自動(dòng)將其回收。

垃圾回收

js的垃圾回收一般有兩種,標(biāo)記清除和引用計(jì)數(shù)。

標(biāo)記清除

GC在運(yùn)行時(shí)會(huì)給儲(chǔ)存在內(nèi)存中的所有變量加上標(biāo)記,然后會(huì)去掉環(huán)境中的變量和被環(huán)境中的變量引用的變量的標(biāo)記,在此之后被加上標(biāo)記的變量被視為要?jiǎng)h除的變量。然后GC完成內(nèi)存清除。
標(biāo)記清除會(huì)遵循以下幾種情況:

在js中,全局變量和window對(duì)象會(huì)一直存在,不會(huì)被GC回收

遞歸所用到的所有方法和變量,不會(huì)被GC回收

閉包里用到的變量,不會(huì)被GC回收

所有被標(biāo)記的,都被認(rèn)為是垃圾,GC會(huì)啟動(dòng)其回收機(jī)制,釋放內(nèi)存。

引用計(jì)數(shù)

當(dāng)對(duì)象被引用次數(shù)為0時(shí),就被回收。潛在的一個(gè)問(wèn)題是:循環(huán)引用時(shí),兩個(gè)對(duì)象都至少被引用了一次,將不能自動(dòng)被回收。所以導(dǎo)致,我們常講的內(nèi)存泄露。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90632.html

相關(guān)文章

  • 【譯文】Node.js垃圾回收機(jī)制-基礎(chǔ)

    摘要:正好最近在學(xué)習(xí)的各種實(shí)現(xiàn)原理,在這里斗膽翻譯一篇垃圾回收機(jī)制原文鏈接。自動(dòng)管理的機(jī)制中,通常都會(huì)包含垃圾回收機(jī)制。二垃圾回收機(jī)制的概念垃圾回收,是一種自動(dòng)管理應(yīng)用程序所占內(nèi)存的機(jī)制,簡(jiǎn)稱方便起見(jiàn),本文均采用此簡(jiǎn)寫。 最近關(guān)注了一個(gè)國(guó)外技術(shù)博客RisingStack里面有很多高質(zhì)量,且對(duì)新手也很friendly的文章。正好最近在學(xué)習(xí)Node.js的各種實(shí)現(xiàn)原理,在這里斗膽翻譯一篇Node...

    haobowd 評(píng)論0 收藏0
  • JS高程中的垃圾回收機(jī)制與常見(jiàn)內(nèi)存泄露的解決方法

    摘要:解決方式是,當(dāng)我們不使用它們的時(shí)候,手動(dòng)切斷鏈接淘汰把和對(duì)象轉(zhuǎn)為了真正的對(duì)象,避免了使用這種垃圾收集策略,消除了以下常見(jiàn)的內(nèi)存泄漏的主要原因。以上參考資料高程垃圾收集類內(nèi)存泄漏及如何避免內(nèi)存泄露及解決方案詳解類內(nèi)存泄漏及如何避免 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1ft1ikzcqzqj30ka0et77a.jpg); 前言 起...

    kidsamong 評(píng)論0 收藏0
  • 前端面試:談?wù)?JS 垃圾回收機(jī)制

    摘要:例如本地函數(shù)的局部變量和參數(shù)當(dāng)前嵌套調(diào)用鏈上的其他函數(shù)的變量和參數(shù)全局變量還有一些其他的,內(nèi)部的這些值稱為根。例如,如果局部變量中有對(duì)象,并且該對(duì)象具有引用另一個(gè)對(duì)象的屬性,則該對(duì)象被視為可達(dá)性,它引用的那些也是可以訪問(wèn)的,詳細(xì)的例子如下。 最近看到一些面試的回顧,不少有被面試官問(wèn)到談?wù)凧S 垃圾回收機(jī)制,說(shuō)實(shí)話,面試官會(huì)問(wèn)這個(gè)問(wèn)題,說(shuō)明他最近看到一些關(guān)于 JS 垃圾回收機(jī)制的相關(guān)的文...

    孫淑建 評(píng)論0 收藏0
  • javascript垃圾回收機(jī)制 - 標(biāo)記清除法/引用計(jì)數(shù)/V8機(jī)制

    摘要:例如,和中的對(duì)象就是實(shí)現(xiàn)的對(duì)象,而對(duì)象的垃圾收集機(jī)制采用的是引用計(jì)數(shù)策略。因此,即使中的引擎使用標(biāo)記清除策略實(shí)現(xiàn),但是訪問(wèn)的對(duì)象依然是基于引用計(jì)數(shù)策略的。垃圾回收器從不移動(dòng)大對(duì)象。 Js GC原理: 找出那些不再繼續(xù)使用的變量,然后釋放其所占用的內(nèi)存,垃圾回收器會(huì)按照固定的時(shí)間間隔周期性地執(zhí)行這一操作 Js GC 策略: 標(biāo)記清除法 引用計(jì)數(shù) JavaScript 內(nèi)存分配: 在定...

    JellyBool 評(píng)論0 收藏0
  • Node.js內(nèi)存管理和V8垃圾回收機(jī)制

    摘要:垃圾回收內(nèi)存管理實(shí)踐先通過(guò)一個(gè)來(lái)看看在中進(jìn)行垃圾回收的過(guò)程是怎樣的內(nèi)存泄漏識(shí)別在環(huán)境里提供了方法用來(lái)查看當(dāng)前進(jìn)程內(nèi)存使用情況,單位為字節(jié)中保存的進(jìn)程占用的內(nèi)存部分,包括代碼本身?xiàng)6选? showImg(https://segmentfault.com/img/remote/1460000019894672?w=640&h=426);作者 | 五月君Node.js 技術(shù)棧 | https:...

    JowayYoung 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<