一:前端关注内存的原因
- 网页端的承载量有限,为了给用户良好的体验,我们要防止页面占用内存过大,引起客户端卡顿,甚至无响应
- Node.JS使用v8引擎,内存对于后端服务的性能至关重要,因为后端服务的持久性,后端更容易造成内存溢出。
二:原理分析
· 原始数据类型:字符串(string)、数字(number)、布尔(boolean)、空对象(null)、未定义(undefined)、symbol
· 引用数据类型:object
· 内存空间:栈内存(stack)、堆内存(heap)
1: 栈内存(stack)基础数据类型醋存储
2: 堆内存(heap)引用类型存储
函数体不执行,就会以代码字符串形式存储在堆内存中
三 : JS的垃圾回收机制
· 垃圾回收:js找出那些不再继续使用的变量,然后释放其所占用的内存,垃圾回收器会按照固定时间间隔周期地执行这一操作
四 : javascript引擎V8的内存管理机制
· 限制内存大小
原因:
1、够用了,js设计的初衷是浏览器脚本语言,只执行一次,便释放内存
2、如果不限制,回收一次100MB的内存大概花费3ms,V8引擎在回收垃圾时,是暂停住所有代码的执行,一旦垃圾过多,在回收内存的时候,中断的时间过长,体验不佳。
· 新生代内存:保存新变量,存活时间短的
假设所有新变量都存在From中,那么在回收的过程中,会先标记活变量,将活着的变量全部复制到To当中,清空From,第二次回收时,标记活变量,将活着的变量全部复制到From当中,清空To 也就是:标记-复制-清空的过程
· 老生代内存:保存老变量,存活时间长的(老变量:经过几次垃圾回收也没有被杀死的变量)
假设在内存中有一片连续的区域:1,2,3,4,5 此时2,4死亡,标记并删除后,内存变为:1,-,3,-,5 这时内存空间会不连续,也就是所谓的内存碎片,如果不进行修补,有可能会放不进数组,因为在数据结构中,数组中的元素是储存在内存中的连续一片地址中的。所以在V8引擎中,老生代内存在标记-删除之后,还要进行一次排列,整理内存碎片。