js内存优化帮助

首先说明,以下内容是对大神文章的笔记,大神文章链接:

JavaScript 内存详解 & 分析指南

了解堆栈

a.栈内存由windows系统直接管理,我们一般不需要操心,我们的内存管理都是对堆内存的处理
b.通常来说一个进程只会有一个堆内存,同一进程下的多个线程会共享一个堆内存,
c.浏览器每个标签页都有一个单独的进程,
d.每一条线程,有独立的栈内存空间,windows 给每条线程分配默认大小1MB的内存,(小心栈溢出)
e.堆栈都是在主存(硬件:内存条)上的,虽然cpu内的高速缓存很快,但是很小,我们退而求其次
任务管理器

变量和函数的储存位置

a.原始类型数据储存在栈内存,引用类型存在堆内存.原始类型:7种,引用类型很多(原文关键字: 原始类型(Primitive type))
b.注意: 全局变量以及被闭包引用的变量(即使是原始类型)均储存在堆内存中(原文关键字:逃逸)
c. 栈内存中的原始值一旦确定就不能被更改,如果一个栈上的变量被赋予了新值,那么会激活一个新的储存空间来存新值并赋值给变量,而不是修改原位置的值
d.对象变量被赋予新值的时候:首先是激活一个新的栈内存来存储新值的地址,然后将这个地址赋值给这个变量
e:js所谓的数组和链表,在强类型语言中眼中都是链表!

垃圾回收机制(原文关键字:垃圾回收)

a.比较常见的v8标记整理算法:①从根节点出发遍历引用并做标记(比较耗时,资源消耗大)②碎片整理,把被标记的往内存空间的一端移动,这个过程会改变内存中的对象内存地址③清除边界后面的对象,也就是最后一个活跃的对象后面,释放他们占用的内存空间
b.v8目前非常流行,谷歌浏览器和Node.js都是用这个.
c.为了提升性能v8把堆内存分成多个区域,我们只关注两个:新空间和旧空间,新空间内的对象经历过两次GC就会被转移到旧空间
d.新空间的数据会被较为频繁地检查然后GC
e. 为了提升用户体验,V8 还实现了一个名为增量标记(Incremental marking)的特性。
增量标记的要点就是把标记工作分成多个小段,夹杂在主线程(Main thread)的 JavaScript 逻辑中,这样就不会长时间阻塞主线程了。(关键字: 加点魔法)
d.优化点:全局变量永远不会被回收,除非手动置空,尽量少用

v8隐藏类机制(关键字:隐藏类)

a.主要用于提升对象性能,每个 object 都会关联一个隐藏类
b.优化点: 在我们创建对象时,拥有完全相同的特征(相同属性且相同顺序)的对象可以共享同一个隐藏类。
c.优化点:避免动态增删对象的属性,否则会新增一个隐藏类,如果属性名是整数,那么就像是数组索引,v8会另做处理
d.隐藏类记录了对象的的属性内存偏移,有了这个偏移量就可以很快定位到对应属性的内存位置,从而提升对象属性的访问速度,这是
e.优化点:在typeScript中,给一个对象赋值的时候按顺序来,可以最大可能地出现共享类,如图,下面来做个试验
ts中这么写:
在这里插入图片描述

编译后的js是这样的: Js中没有声明属性,这种操作…
在这里插入图片描述在这里插入图片描述

运行时的隐藏类:c和c_2的隐藏类是一样的,因为他们设置赋值属性的顺序一样
在这里插入图片描述

f.不需要的属性置空
g.扩展: https://blog.csdn.net/weixin_34217773/article/details/91429927

闭包(关键字:Closure)

a.闭包如果一直被引用着,那么闭包所引用的东西也一直无法被释放,优化点:需要谨慎使用闭包
b.及时解除闭包的引用

至此,文章看了一半,剩下的是对开发者工具的内存分析工具的使用(关键字:Memory in Devtools)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值