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