javascript中的垃圾回收机制和内存泄漏问题(面试高频考点)

问题:请介绍一下 javascript 中的垃圾回收站机制。
回答:

javascript 具有自动垃圾回收机制,垃圾收集器会按照固定的时间间隔周期性的执行。javascript 中常见的垃圾回收方式**:标记清除、引用计数两种方式(一般都使用的是标记清除方式,引用计数方式会出现循环引用的问题)。
1.标记清除方式:
工作原理:当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。最后标记”离开环境“的就回收内存
工作流程:
(1)变量进入上下文,也可理解为作用域,会加上标记,证明其存在于该上下文;
(2)将所有在上下文中的变量以及上下文中被访问引用的变量标记去掉,表明这些变量活跃有用;
(3)在此之后再被加上标记的变量标记为准备删除的变量,因为上下文中的变量已经无法访问它们;
(4)执行内存清理,销毁带标记的所有非活跃值并回收之前被占用的内存;
2. 计数清除方式:
工作原理:跟踪记录每个值被引用的次数
工作流程:
(1)声明一个变量,赋予它一个引用值时,计数+1;
(2)同一个值被赋予另外一个变量时,引用+1;
(3)保存对该值引用的变量被其他值覆盖,引用-1;
(4)引用为0,回收内存;


什么是内存泄露?
程序的运行需要内存,只要程序提出要求,操作系统或者运行时(runtime) 就必须供给内存。而对于持续运行的服务进程(daemon), 必须及时释放不再用到的内存。否则,内存占用越拉越高,轻则影响系统性能,重则导致进程崩溃。 也就是说,不再使用到的内存,如果没有及时释放,就叫做内存泄露(memory leak) 常见的内存泄漏主要有下面几个场景:

1.意外声明全局变量

function hello (){
    name = 'tom'
}
hello();

未声明的对象会被绑定在全局对象上,就算不被使用了,也不会被回收,所以写代码的时候,一定要记得声明变量

2.定时器

let name = 'Tom';
setInterval(() => {
  console.log(name);
}, 100);

定时器的回调通过闭包引用了外部变量,如果定时器不清除,name会一直占用着内存,所以用定时器的时候最好明白自己需要哪些变量,检查定时器内部的变量,另外如果不用定时器了,记得及时清除定时器

3.闭包

let out = function() {
  let name = 'Tom';
  return function () {
    console.log(name);
  }
}

由于闭包会常驻内存,在这个例子中,如果out一直存在,name就一直不会被清理,如果name值很大的时候,就会造成比较严重的内存泄漏。所以一定要慎重使用闭包。

4.事件监听

mounted() {
window.addEventListener("resize",  () => {
    //do something
});
}

在页面初始化时绑定了事件监听,但是在页面离开的时候未清除事监听,就会导致内存泄漏。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值