摘要:一內(nèi)存生命周期分配需要的內(nèi)存初始化值時(shí)使用分配的內(nèi)存不需要時(shí)將其內(nèi)存釋放垃圾回收器注意全局變量的生命周期直至瀏覽器卸載頁面才會(huì)結(jié)束。
一、內(nèi)存生命周期
1、分配需要的內(nèi)存(初始化值時(shí))
2、使用分配的內(nèi)存
3、不需要時(shí)將其內(nèi)存釋放(垃圾回收器)
注意:
(1)全局變量的生命周期直至瀏覽器卸載頁面才會(huì)結(jié)束。
(2)局部變量只在函數(shù)的執(zhí)行過程中存在,而在這個(gè)過程中會(huì)為局部變量在?;蚨焉戏峙湎鄳?yīng)的空間,以存儲(chǔ)它們的值,然后再函數(shù)中使用這些變量直至函數(shù)結(jié)束局部變量就沒有存在必要了,可以釋放它們占用的內(nèi)存
(1)算法原理
通過在對(duì)象頭中分配一個(gè)空間來保存該對(duì)象被引用的次數(shù)。如果該對(duì)象被其它對(duì)象引用,則它的引用計(jì)數(shù)加一,如果刪除對(duì)該對(duì)象的引用,那么它的引用計(jì)數(shù)就減一,當(dāng)該對(duì)象的引用計(jì)數(shù)為0時(shí),那么該對(duì)象就會(huì)被回收。
(2)算法理解
var p = new String("abc"); // 分配所需內(nèi)存并且被p引用 abc這個(gè)字符串對(duì)象的引用計(jì)數(shù)值為1.
p = null; // 去除abc字符串對(duì)象的引用,abc字符串對(duì)象的引用計(jì)數(shù)減1
重點(diǎn)理解
1、當(dāng)對(duì)象的引用發(fā)生變化時(shí),首先對(duì)原來引用對(duì)象的計(jì)數(shù)減一,再對(duì)新的引用對(duì)象的計(jì)數(shù)加一
var p = new String("abc"); var q = new String("efd"); p = q;
2、當(dāng)某個(gè)對(duì)象的引用計(jì)數(shù)減為0時(shí),collector需要遞歸遍歷它所指向的所有域,將它所有域所指向的對(duì)象的引用計(jì)數(shù)都減一,然后才能回收當(dāng)前對(duì)象。在遞歸過程中,引用計(jì)數(shù)為0的對(duì)象也都將被回收,并把該對(duì)象的內(nèi)存塊加入空閑鏈表中
var p = { phone:new String("1592xxxx"), address:new String("1130 kifer rd") } p = null;
3、循環(huán)引用
function f(){ var o = {}; var o2 = {}; o.a = o2; // o 引用 o2 o2.a = o; // o2 引用 o return "azerty"; } f();
(3)觸發(fā)時(shí)機(jī)
引用計(jì)數(shù)垃圾收集機(jī)制在引用計(jì)數(shù)變化為0時(shí)即刻發(fā)生,而且只針對(duì)某一個(gè)對(duì)象以及它所依賴的其它對(duì)象。所以,我們一般也稱呼引用計(jì)數(shù)垃圾收集為直接的垃圾收集機(jī)制
(1)算法原理
這個(gè)算法把“對(duì)象是否不再需要”簡(jiǎn)化定義為“對(duì)象是否可以獲得”。
標(biāo)記階段是把所有活動(dòng)對(duì)象都做上標(biāo)記的階段。清除階段是把那些沒有標(biāo)記的對(duì)象,也就是非活動(dòng)對(duì)象回收的階段。通過這兩個(gè)階段,就可以令不能利用的內(nèi)存空間重新得到利用
這個(gè)算法假定設(shè)置一個(gè)叫做根(root)的對(duì)象(在Javascript里,根是全局對(duì)象)。垃圾回收器將定期從根開始,找所有從根開始引用的對(duì)象,然后找這些對(duì)象引用的對(duì)象……從根開始,垃圾回收器將找到所有可以獲得的對(duì)象和收集所有不能獲得的對(duì)象。
(2)算法理解
var teacher = {name:"Mary",age:35}; var student = { stu1:{name:"Amy",age:13}, stu2:{name:"Dai",age:15} }
標(biāo)記階段
// 標(biāo)記階段偽代碼 // 進(jìn)行標(biāo)記階段的處理 mark_phase(){ for(r : $roots) mark(*r) } // 遞歸地標(biāo)記通過指針數(shù)組能訪問到的對(duì)象。這樣就能把所有活動(dòng)對(duì)象都標(biāo)記上了。 mark(obj){ if(obj.mark == FALSE) obj.mark = TRUE for(child : children(obj)) mark(*child) }
清除階段
// 標(biāo)記清除偽代碼 1 sweep_phase(){ 2 sweeping = $heap_start // 從堆首地址開始 3 while(sweeping < $heap_end) // 遍歷每個(gè)標(biāo)志位 4 if(sweeping.mark == TRUE) // 如果遍歷到已標(biāo)記元素 5 sweeping.mark = FALSE // 將標(biāo)記清除 6 else // 沒有遍歷到 7 sweeping.next = $free_list // 將其插在空閑鏈表頭部 8 $free_list = sweeping // 將空閑鏈表指針指向所有空閑鏈 9 sweeping += sweeping.size // 繼續(xù)進(jìn)行查找 10 }
(3)觸發(fā)時(shí)機(jī)
垃圾收集器會(huì)按照固定的時(shí)間間隔或代碼執(zhí)行中預(yù)定的收集時(shí)間,周期性地執(zhí)行
參考文章
內(nèi)存管理
引用計(jì)數(shù)算法
GC-標(biāo)記清除算法
深入理解作用域鏈(超贊)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/99061.html
摘要:內(nèi)存回收此時(shí),局部變量就沒有存在的必要了,因此可以釋放它們的內(nèi)存以供將來使用。局部變量會(huì)在它們離開執(zhí)行環(huán)境時(shí)自動(dòng)被解除引用,如下面這個(gè)例子所示手工解除的引用由于局部變量在函數(shù)執(zhí)行完畢后就離開了其執(zhí)行環(huán)境,因此無需我們顯式地去為它解除引用。 JavaScript 具有自動(dòng)垃圾收集機(jī)制(GC:Garbage Collecation),也就是說,執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。而...
摘要:引入的同步算法傳統(tǒng)上,像以前的用到的引用計(jì)數(shù)內(nèi)存機(jī)制,無法處理循環(huán)引用的內(nèi)存泄漏。然而使用文章引用計(jì)數(shù)系統(tǒng)中的同步周期回收中的同步算法,解決了這個(gè)內(nèi)存泄漏問題,這種算法就是的垃圾回收機(jī)制。 引用賦值 $a = apple; $b = &$a; 上述代碼中,我將一個(gè)字符串賦值給變量a,然后將a的引用賦值給了變量b。顯然,這個(gè)時(shí)候的內(nèi)存指向應(yīng)該是這樣的: $a -> apple
摘要:如果沒有引用指向該對(duì)象零引用,對(duì)象將被垃圾回收機(jī)制回收。經(jīng)過增量標(biāo)記改進(jìn)后,垃圾回收的最大停頓時(shí)間可以減少到原來的左右。解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運(yùn)行時(shí)將其回收。 前言 在講 JS 的垃圾回收(Garbage Collection)之前,我們回顧上一篇《JS專題之memoization》,memoization 的原理是以參數(shù)作為 key,函數(shù)結(jié)果作為 v...
摘要:垃圾回收內(nèi)存管理實(shí)踐先通過一個(gè)來看看在中進(jìn)行垃圾回收的過程是怎樣的內(nèi)存泄漏識(shí)別在環(huán)境里提供了方法用來查看當(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:...
摘要:年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對(duì)象。年老代在年輕代中經(jīng)歷了次垃圾回收后仍然存活的對(duì)象,就會(huì)被放到年老代中。什么情況下觸發(fā)垃圾回收由于對(duì)象進(jìn)行了分代處理,因此垃圾回收區(qū)域時(shí)間也不一樣。 [TOC] 與C/C++相比,java語言不需要程序員直接控制內(nèi)存回收,java程序的內(nèi)存分配和回收都是由JRE在后臺(tái)自動(dòng)進(jìn)行,JRE會(huì)負(fù)責(zé)回收那些不再使用的內(nèi)存,這種機(jī)制被稱為垃圾...
閱讀 1376·2021-11-15 11:37
閱讀 3584·2021-11-11 16:55
閱讀 1816·2021-08-25 09:39
閱讀 3281·2019-08-30 15:44
閱讀 1795·2019-08-29 12:52
閱讀 1463·2019-08-29 11:10
閱讀 3309·2019-08-26 11:32
閱讀 3284·2019-08-26 10:16