摘要:今天總結(jié)下的回收機制。說起的回收機制,一定要先說的內(nèi)存分配了。為什么內(nèi)存還要區(qū)分堆內(nèi)存和棧內(nèi)存呢這里就要說到的垃圾回收機制了。
今天總結(jié)下js的回收機制。
說起js的回收機制,一定要先說js的內(nèi)存分配了。
內(nèi)存分配前端的同學們肯定知道,js的變量分為基本類型和引用類型。
基本類型
js的基本類型有String,Number,Boolean,Null,Undefined,這些變量在內(nèi)存中占用固定的空間大小,聲明之后會被分配到棧內(nèi)存中,我們是按值訪問的。
引用類型
js的引用類型的值大小是不固定的,需要通過引用來找到相應(yīng)的值,在棧內(nèi)存中會分配空間存放引用類型在堆內(nèi)存中的地址,在堆內(nèi)存中會存放對應(yīng)的值。因為地址的大小是固定的,所以可以存在棧內(nèi)存中,需要用到的時候,會到棧內(nèi)存中先找到這個引用地址,然后再在堆中找到這個值。
為什么內(nèi)存還要區(qū)分堆內(nèi)存和棧內(nèi)存呢?這里就要說到j(luò)s的垃圾回收機制了。
為什么會有垃圾回收呢?當然是為了使程序運行時的內(nèi)存最小啦。
當一個方法執(zhí)行的時候,會有部分內(nèi)存用來存方法中聲明的變量,這些變量都被存在棧內(nèi)存中,當方法結(jié)束的時候,這個棧內(nèi)存中的變量(除了地址以外)都會被銷毀。
但是當我們聲明一個對象的時候,這個對象在其他地方也被引用了,這個對象的大小是不固定的,會被分配到堆內(nèi)存中,隨著方法的結(jié)束,這個堆內(nèi)存也不會被銷毀,因為其他地方還在引用(方法的傳參等等),除非這個對象的引用為0,垃圾回收機制才會在核實之后銷毀他,這里就牽扯到了垃圾回收中的引用計數(shù),下面會講到。
內(nèi)存聲明周期內(nèi)存聲明周期:
分配你所需要的內(nèi)存
使用分配到的內(nèi)存讀和寫
不需要時將其釋放
在js中,第三部分是自動完成的,因為js中有自動垃圾回收機制。在編寫js時,不需要關(guān)心內(nèi)存的使用問題,所需內(nèi)存的分配和內(nèi)存的釋放都是自動完成的。
內(nèi)存泄漏什么情況下會內(nèi)存泄漏?可以這么理解,就是有些代碼本來應(yīng)該要被回收的,但是沒有被回收,所以一直占用著操作系統(tǒng)的內(nèi)存,從而越積越多。一般的內(nèi)存泄漏其實無關(guān)緊要,可怕的是內(nèi)存泄漏引起的堆積,導致GC一直沒辦法使用所占用的內(nèi)存給其他程序使用。
內(nèi)存溢出內(nèi)存溢出就是程序向系統(tǒng)申請一定大小的內(nèi)存,但是系統(tǒng)滿足不了。
管理內(nèi)存處于安全的考慮,一般情況下系統(tǒng)給瀏覽器的內(nèi)存會比給客戶端的內(nèi)存要少,即使瀏覽器內(nèi)存泄漏了或者內(nèi)存溢出了也不會讓系統(tǒng)崩潰。內(nèi)存限制的問題不僅會影響到給變量分配的內(nèi)存,也會影響每個線程最多能執(zhí)行的語句數(shù)量。
所以為了確保在有限的內(nèi)存中可以讓頁面獲得最好的性能,優(yōu)化內(nèi)存占用的最佳方式就是將其值設(shè)置為null來釋放其引用。這個方法叫做解除引用,適用于全局變量和全局對象的屬性,局部變量在離開執(zhí)行環(huán)境之后就會自動被解除引用。
解除引用并不意味著馬上回收該值所占用的內(nèi)存,解除引用的真正作用是讓值離開執(zhí)行環(huán)境,讓GC下次運行時自動將其回收。
垃圾回收js的垃圾回收一般有兩種,標記清除和引用計數(shù)。
標記清除GC在運行時會給儲存在內(nèi)存中的所有變量加上標記,然后會去掉環(huán)境中的變量和被環(huán)境中的變量引用的變量的標記,在此之后被加上標記的變量被視為要刪除的變量。然后GC完成內(nèi)存清除。
標記清除會遵循以下幾種情況:
在js中,全局變量和window對象會一直存在,不會被GC回收
遞歸所用到的所有方法和變量,不會被GC回收
閉包里用到的變量,不會被GC回收
所有被標記的,都被認為是垃圾,GC會啟動其回收機制,釋放內(nèi)存。
引用計數(shù)當對象被引用次數(shù)為0時,就被回收。潛在的一個問題是:循環(huán)引用時,兩個對象都至少被引用了一次,將不能自動被回收。所以導致,我們常講的內(nèi)存泄露。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90632.html
摘要:正好最近在學習的各種實現(xiàn)原理,在這里斗膽翻譯一篇垃圾回收機制原文鏈接。自動管理的機制中,通常都會包含垃圾回收機制。二垃圾回收機制的概念垃圾回收,是一種自動管理應(yīng)用程序所占內(nèi)存的機制,簡稱方便起見,本文均采用此簡寫。 最近關(guān)注了一個國外技術(shù)博客RisingStack里面有很多高質(zhì)量,且對新手也很friendly的文章。正好最近在學習Node.js的各種實現(xiàn)原理,在這里斗膽翻譯一篇Node...
摘要:解決方式是,當我們不使用它們的時候,手動切斷鏈接淘汰把和對象轉(zhuǎn)為了真正的對象,避免了使用這種垃圾收集策略,消除了以下常見的內(nèi)存泄漏的主要原因。以上參考資料高程垃圾收集類內(nèi)存泄漏及如何避免內(nèi)存泄露及解決方案詳解類內(nèi)存泄漏及如何避免 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1ft1ikzcqzqj30ka0et77a.jpg); 前言 起...
摘要:例如本地函數(shù)的局部變量和參數(shù)當前嵌套調(diào)用鏈上的其他函數(shù)的變量和參數(shù)全局變量還有一些其他的,內(nèi)部的這些值稱為根。例如,如果局部變量中有對象,并且該對象具有引用另一個對象的屬性,則該對象被視為可達性,它引用的那些也是可以訪問的,詳細的例子如下。 最近看到一些面試的回顧,不少有被面試官問到談?wù)凧S 垃圾回收機制,說實話,面試官會問這個問題,說明他最近看到一些關(guān)于 JS 垃圾回收機制的相關(guān)的文...
摘要:例如,和中的對象就是實現(xiàn)的對象,而對象的垃圾收集機制采用的是引用計數(shù)策略。因此,即使中的引擎使用標記清除策略實現(xiàn),但是訪問的對象依然是基于引用計數(shù)策略的。垃圾回收器從不移動大對象。 Js GC原理: 找出那些不再繼續(xù)使用的變量,然后釋放其所占用的內(nèi)存,垃圾回收器會按照固定的時間間隔周期性地執(zhí)行這一操作 Js GC 策略: 標記清除法 引用計數(shù) JavaScript 內(nèi)存分配: 在定...
摘要:垃圾回收內(nèi)存管理實踐先通過一個來看看在中進行垃圾回收的過程是怎樣的內(nèi)存泄漏識別在環(huán)境里提供了方法用來查看當前進程內(nèi)存使用情況,單位為字節(jié)中保存的進程占用的內(nèi)存部分,包括代碼本身棧堆。 showImg(https://segmentfault.com/img/remote/1460000019894672?w=640&h=426);作者 | 五月君Node.js 技術(shù)棧 | https:...
閱讀 1810·2021-11-24 09:39
閱讀 2295·2021-09-30 09:47
閱讀 4157·2021-09-22 15:57
閱讀 1881·2019-08-29 18:36
閱讀 3583·2019-08-29 12:21
閱讀 596·2019-08-29 12:17
閱讀 1271·2019-08-29 11:25
閱讀 731·2019-08-28 18:26