javascript ------- 内存管理

概述

      在 c 和 c++ 等语言中,跟踪内存使用对开发者来是一件很烦恼的事。而 javascript 通过自动内存管理(内存分配和闲置资源回收)为开发者解决这个烦恼。

垃圾回收

  • 标记清理

        标记清理是指垃圾回收程序运行时,会标记内存中储存的所有变量,然后,它会将所有在环境(上下文)中的变量或者被环境(上下文)引用的变量,将这些变量的标记都清除掉,其他还被标记的变量就是带删除的了。垃圾回收程序会做一次内存清理,将带标记的变量都清理掉

  • 引用计数

        引用计数是指对每一个变量都记录它被引用的次数。声明变量就给这个变量一次引用值,此时引用值为 1,如果同一个变量被赋给另外一个变量时,那么引用值就加 1。同理,被覆盖的话,引用值就减 1。当引用值为 0 的时候,就证明这个变量就可以回收释放内存了

注:因为引用计数如果碰到循环引用( A 对象里有个指针指向 B 对象,B 对象里有个指针指向 A对象)的话,那会导致它们引用值永远不为 0,如果这两个对象被多次引用的话,就会导致大量内存不能释放。事实上,引用计数的问题不止如此,故现在绝大多数浏览器都是用标记清理

内存泄露

        虽然有了垃圾回收机制。开发过程中,js 开发者可以不用考虑跟踪内存使用。但是平时开发过程中也要注意编写,防止造成内存泄露。常见的内存泄露有以下几种:

// 未声明变量
function w (){
  name='WFatTiger'
}


// 定时器未销毁
const high = 180
setInterval(() => {
  console.log(high);
}, 100);



// 使用闭包过程中
function f() {
  const age = 18
  return function () {
    return age
  }
}

性能优化

  • 在项目中,保证在执行代码时只保存必要的数据,或者当数据不在需要的时候,将变量手动设置为 null,从而释放内存。
  • 使用 const 或者 let 声明变量,可以让垃圾回收机制更早介入(在块作用域比函数作用域更早终止的情况下)
  • 在 chrome 中,chrome v8 javascript 引擎会将创建的对象与它自身的隐藏类关联起来。所以一个构造函数创建多个实例对象时候,可以让它们共用同一个隐藏类,避免动态属性赋值的方式创建。
// 动态赋值创建
class W {
  constructor() {
    this.name = 'WFatTiger';
  }
 
}
const w1= new W()
const w2= new W()
console.log(w1); // W { name: 'WFatTiger' }
w1.high = 180 // 动态赋值
console.log(w1,'add'); // W { name: 'WFatTiger', high: 180 } add
delete w1.high  // 动态删除 
console.log(w1,'delete'); // W { name: 'WFatTiger' } delete

// 正确创建
class F {
  constructor(high) {
    this.name = 'WFatTiger';
    this.high = high
  }
}
const f1 = new F()
const f2 = new F(180)
console.log(f1, f2); // F { name: 'WFatTiger', high: undefined }, F { name: 'WFatTiger', high: 180 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值