JavaScript 的內存管理

這是我參與8月更文挑戰的第6天,活動詳情查看:8月更文挑戰算法

前言

任何程序的運行都須要分配內存,如咱們運行一個網頁。若是分配的一些內存不能及時的獲得釋放,就稱爲內存泄露,當出現大量的內存泄露時,就是內存溢出,內存溢出簡單來講就是咱們使用的內存大於系統可以提供的內存空間,內存溢出的的直接現象就是頁面的卡頓,更嚴重的就是頁面的崩潰。致使用戶體驗差,用戶流失。markdown

本文你將瞭解:svn

  • js 的內存分配
  • 垃圾回收機制
  • 垃圾回收策略
  • V8 的內存管理
  • V8 的回收策略

內存的生命週期

無論什麼程序語言,內存生命週期基本是一致的: oop

JavaScript 的內存分配

JS的數據類型分爲兩種,一種是原始數據類型,包括string、number、boolean、null、undefined、sybmol、bigint 。還有一種是引用數據類型Object。數據類型不一樣在內存存儲方式也是不同的,內存分爲三種,棧內存、堆內存和代碼空間。post

棧內存 是一種後進先出的結構,例如一個水桶,水桶的底部就至關於棧底,水桶的進水處就至關於棧頂,水桶的水由棧頂進入,棧頂 出去,因爲原始數據類型是大小固定的,由內存自動分配內存因此他存在於棧內存中。咱們建立一個變量,例如var a = 10; 在內存中是先將10放入內存的,在將a放入內存,而後把a和10關聯起來。而引用數據類型,大小不固定,存儲在堆中,例如 一個對象var obj = {},首先在堆中會開闢出一塊內存出來,存儲對象的值,而後生成一個十六進制的地址碼,最後在棧 中放入這個地址碼,並放入obj,使地址碼和obj關聯起來。測試

垃圾回收機制

找出那些不在繼續使用的變量,而後回收他們所佔用的內存,垃圾回收器會隔一段時間進行一次垃圾回收,不一樣的引擎這個回收時間不一致。js使用垃圾回收來自動管理內存,可是垃圾回收是一把雙刃劍。flex

垃圾收集策略

V8 的內存管理

首先咱們要知道 V8 是有內存限制的,這裏你可能會奇怪爲何 V8 會有內存的限制了?url

哪 V8 的回收測試又是怎麼樣的了。其實 V8 採用分代回收的策略,將內存分爲新生代老生代。V8對新生代和老生代採用不一樣的垃圾回收算法來提高效率。spa

總結

內存管理存儲比較抽象,可是和咱們平常的研發息息相關,瞭解內存的管理,對平常處理內存問題也會更加駕輕就熟一些。但願對你有幫助。code

若是你以爲寫得不錯,幫忙點個贊吧。

參考

相關文章
相關標籤/搜索