垃圾回收機(jī)制

二兜材、垃圾回收原理淺析

現(xiàn)在各大瀏覽器通常用采用的垃圾回收有兩種方法:標(biāo)記清除档押、引用計(jì)數(shù)。

1锅论、標(biāo)記清除

這是javascript中最常用的垃圾回收方式讼溺。當(dāng)變量進(jìn)入執(zhí)行環(huán)境是,就標(biāo)記這個變量為“進(jìn)入環(huán)境”棍厌。從邏輯上講肾胯,永遠(yuǎn)不能釋放進(jìn)入環(huán)境的變量所占用的內(nèi)存竖席,因?yàn)橹灰獔?zhí)行流進(jìn)入相應(yīng)的環(huán)境耘纱,就可能會用到他們。當(dāng)變量離開環(huán)境時毕荐,則將其標(biāo)記為“離開環(huán)境”束析。   垃圾收集器在運(yùn)行的時候會給存儲在內(nèi)存中的所有變量都加上標(biāo)記。然后憎亚,它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的標(biāo)記员寇。而在此之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量了第美。最后蝶锋。垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值什往,并回收他們所占用的內(nèi)存空間扳缕。

關(guān)于這一塊,建議讀讀Tom大叔的幾篇文章别威,關(guān)于作用域鏈的一些知識詳解躯舔,讀完差不多就知道了,哪些變量會被做標(biāo)記省古。

2粥庄、引用計(jì)數(shù)

另一種不太常見的垃圾回收策略是引用計(jì)數(shù)。引用計(jì)數(shù)的含義是跟蹤記錄每個值被引用的次數(shù)豺妓。當(dāng)聲明了一個變量并將一個引用類型賦值給該變量時惜互,則這個值的引用次數(shù)就是1。相反琳拭,如果包含對這個值引用的變量又取得了另外一個值训堆,則這個值的引用次數(shù)就減1。當(dāng)這個引用次數(shù)變成0時臀栈,則說明沒有辦法再訪問這個值了蔫慧,因而就可以將其所占的內(nèi)存空間給收回來。這樣权薯,垃圾收集器下次再運(yùn)行時姑躲,它就會釋放那些引用次數(shù)為0的值所占的內(nèi)存睡扬。 但是用這種方法存在著一個問題,下面來看看代碼:

[
image

](javascript:void(0);)

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n10" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">function problem() {
var objA = new Object();
var objB = new Object();
?
objA.someOtherObject = objB;
objB.anotherObject = objA;
}</pre>

[
image

](javascript:void(0);)

在這個例子中黍析,objAobjB通過各自的屬性相互引用卖怜;也就是說這兩個對象的引用次數(shù)都是2。在采用引用計(jì)數(shù)的策略中阐枣,由于函數(shù)執(zhí)行之后马靠,這兩個對象都離開了作用域,函數(shù)執(zhí)行完成之后蔼两,objAobjB還將會繼續(xù)存在甩鳄,因?yàn)樗麄兊囊么螖?shù)永遠(yuǎn)不會是0。這樣的相互引用如果說很大量的存在就會導(dǎo)致大量的內(nèi)存泄露额划。

優(yōu)化的方式

盡量少用new的方式 因?yàn)樗鼤男麻_辟一個地址空間來占用內(nèi)存

少定義全局的變量(全局的變量不會被垃圾回收)

想要把數(shù)組清空有兩種方式 一種是直接從新賦值一個空的數(shù)組 這種會占用一點(diǎn)內(nèi)存 盡量使用

arr.lenght = 0的方式去清空數(shù)組

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妙啃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俊戳,更是在濱河造成了極大的恐慌揖赴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抑胎,死亡現(xiàn)場離奇詭異燥滑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阿逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門铭拧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盆昙,你說我怎么就攤上這事羽历。” “怎么了淡喜?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵秕磷,是天一觀的道長。 經(jīng)常有香客問我炼团,道長澎嚣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任瘟芝,我火速辦了婚禮易桃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锌俱。我一直安慰自己晤郑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著造寝,像睡著了一般磕洪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诫龙,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天析显,我揣著相機(jī)與錄音,去河邊找鬼签赃。 笑死谷异,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锦聊。 我是一名探鬼主播歹嘹,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼括丁!你這毒婦竟也來了荞下?” 一聲冷哼從身側(cè)響起伶选,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤史飞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仰税,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體构资,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年陨簇,在試婚紗的時候發(fā)現(xiàn)自己被綠了吐绵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡河绽,死狀恐怖己单,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耙饰,我是刑警寧澤纹笼,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站苟跪,受9級特大地震影響廷痘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜件已,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一笋额、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篷扩,春花似錦兄猩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽援岩。三九已至,卻和暖如春掏导,著一層夾襖步出監(jiān)牢的瞬間享怀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工趟咆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留添瓷,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓值纱,卻偏偏與公主長得像鳞贷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虐唠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • 什么是垃圾回收機(jī)制搀愧? 和java,c#一樣疆偿,javascript也有垃圾回收的機(jī)制咱筛,比如說c++和c就沒有垃圾回收...
    我向你奔閱讀 478評論 0 1
  • JVM筆記 JDK:Java、JVM杆故、Java API類庫迅箩,是支持java程序開發(fā)的最小環(huán)境。JRE:Java A...
    一條小袍袍YoY閱讀 873評論 0 4
  • 一处铛、垃圾回收機(jī)制的意義Java語言中一個顯著的特點(diǎn)就是引入了垃圾回收機(jī)制饲趋,使c++程序員最頭疼的內(nèi)存管理的問題迎刃...
    任任任任師艷閱讀 637評論 0 0
  • JVM內(nèi)存區(qū)域 JVM將其管理的內(nèi)存分為若干數(shù)據(jù)區(qū)域荒吏,這些數(shù)據(jù)區(qū)域分布情況如下圖所示: 程序計(jì)數(shù)器:一塊較小內(nèi)存區(qū)...
    luoxn28閱讀 695評論 0 0
  • JS的內(nèi)存生命周期: 1夫否、分配你所需要的內(nèi)存 2、使用分配到的內(nèi)存(讀柒啤、寫) 3家肯、不需要時將其釋放龄砰、歸還 var ...
    grain先森閱讀 970評論 0 19