面试常见问题之 JavaScript 内存机制 总结

微信扫一扫,分享到朋友圈

面试常见问题之 JavaScript 内存机制 总结

一、我们前端为什么要关注内存

1.防止内存泄露时网页占用的内存过大、引起客户端卡顿、无响应等给用户造成不良体验。

2.Node.js使用的是V8引擎,内存对于后端服务的性能至关重要,因为后端服务的持久性,后端更容易造成内存溢出。

3.面试中有时会被问到相关问题,故此小结了一下几点,帮助大家了解JS内存机制。

二、JS的数据类型

要了解JS内存机制,首先需要重温下JS的数据类型,从而才能更加全面的掌握JS内存机制。

1.首先,js的数据类型主要分为 原始数据类型
引用数据类型
两种。

原始数据类型:String、Number、Boolean、Symbool、Null、Undefined
引用数据类型:Object
其中,数据类型和他们所占用的内存空间对应关系如下
原始数据类型———栈内存(STACK) (按值访问)
引用数据类型———堆内存(heap) (大小不固定,保存的是堆内存的一个引用地址)
在JS中把引用类型赋值给变量时,内存方面大致做了下面几步:
1.首先在堆内存中开辟一块空间,将引用类型的值存储进去,返回一个引用地址(因为引用类型你大小的不固定性);
2.把引用地址压入栈中与变量相关联,当查找变量时,会按照其栈中的引用地址到堆内存中查找相关数据。
3.函数的声明:函数声明其实也是引用数据类型声明的一种,只是把函数体的字符串形式放入堆内存开辟的空间中,保留一个堆内存的地址。所以当浏览器直接打印函数fn的时候,会得到一个字符串形式的函数体,而只有当执行fn()时,才会把字符串形式的函数体用JS执行编译。
复制代码

三、JS的垃圾回收机制

JS的内存管理机制中会周期性的执行垃圾回收机制,目的是清除掉不再使用的变量,释放其占用的不必要的内存空间。

垃圾回收策略:
1.按引用计数策略(IE8以前会存在相关问题)
跟踪记录每个变量被引用的次数,每引用一次就+1,每被释放时-1,如果一个值的引用最终为0,就将它对应的内存空间释放。
该策略缺点:遇上循环引用时,变量始终不会被释放,引用次数永远大于0,无法回收。如:
obj1 = {a:1};
obj2 = {b:2};
obj2.d = obj2;
obj1.e = obj1;
2.标记清除策略(目前主流浏览器的垃圾回收策略)
指当变量进入执行环境(全局、局部环境)时,将变脸标记为“进入状态”,当变量离开环境时(或环境被销毁时),标记为“离开状态”,同时销毁掉带有标记的值并回收其所占用的内存空间。
function fn(){
var a  =  0; "标记为进入状态"
var b = 1;"标记为进入状态"
}
fn() //函数执行后局部环境被销毁,其变量a 、b被标记为离开并被回收其占用的内存空间。
复制代码

四、V8内存管理机制

1. V8限制内存原因:
防止因为垃圾回收时所导致的线程暂停时间过长。(1.5G的垃圾回收需要50毫秒)。
2. V8垃圾回收策略
分代回收(分为新生代(存放存活时间较短的对象)和老生代(存放存活时间较长的对象)),对不同代采用不同的回收算法,其中新生代达到某些条件后会晋升为老生代。
复制代码

微信扫一扫,分享到朋友圈

面试常见问题之 JavaScript 内存机制 总结

菜鸟入股环世物流集团 持股10.33%成第三大股东

上一篇

8月特斯拉Model 3销量近1.2万辆

下一篇

你也可能喜欢

面试常见问题之 JavaScript 内存机制 总结

长按储存图像,分享给朋友