JS进阶--内存管理
一、管理内存的意义
1. 减少浏览器的负担
内存过大 就会让浏览器卡顿\无响应
2. Node端
而Node.js开启的服务,内存占用太多,导致不够用,服务器就会中断
二、内存的数据储存
1. 内存的分类
栈内存
从上往下的堆叠,只有一个进出口,线性、连续
堆内存
是树状的,非线性的数据结构,每一个点都是一个内存地址,不一定是连续的, 是反复的
2. 数据的存储
普通类型变量的储存
字符串、数字、布尔值、非引用类型的数据是直接储存到栈内存之中,变量直接指向值
方法、对象、数组等引用类型
方法、对象、数组等引用类型的储存会先在堆内存中开辟一个地址存放,而后如果有将方法、对象、数组等引用类型进行了赋值给变量的操作,就会在栈内存中存放,变量直接指向之前开辟的地址
3. v8内存的管理
v8有多大
-
64位下有1.4G(分配:分为新生代和老生代;新生代储存短时间存活的新变量,其内存量极小,64位下大概是32MB;生存时间较长的变量会转存到老生代,老生代基本占据所有内存,64位下大概1400MB。
-
32位下700MB
-
根据浏览器的不同,有些许扩容。Node情况下会有一些C++内存扩容
新生代的回收算法
新生代的空间分为:
当前被使用的空间—from空间;完全空白的空间-----to空间。
在使用变量的过程中,逐渐会有变量失去作用,在下一次变量回收的时候,会把没有失去作用的变量,复制到to空间之中,而后 清空from空间,最后from与to对调,最后还是from空间正在使用,to空间完全空白。这样做提升了回收的速度,属于典型的牺牲空间换时间。动作可以简单概括成:复制–清空;
老生代的回收算法
老生代的空间较大不能和新生代操作相同,否则会造成较大空间浪费
具体步骤为:①. 标记已死变量;②. 清除已死变量;③. 整理磁盘(清除已死变量位置的内存空隙,确保内存的最大化利用)。
触发回收的时机
-
执行完代码时
-
内存不够时