• v8引擎垃圾回收机制


    • v8内存大小
      V8引擎中的内存使用: v8引擎在64位系统下最多只能使用约1.4GB的内存,在32位系统下最多只能使用约0.7GB的内存
      v8的内存限制(为什么内存这么小,对内存进行限制呢??)
      两点原因:
      1 js是单线程,V8执行垃圾回收时,程序中的其他各种逻辑都要进入暂停等待阶段,直到垃圾回收结束后才会再次重新执行JS逻辑。因此,由于JS的单线程机制,垃圾回收的过程阻碍了主线程逻辑的执行。
      2 垃圾回收本身也是一件非常耗时的操作,在垃圾回收的过程中浏览器一直处于等待的状态,同时会失去对用户的响应。
      因此如果内存使用过高,那么必然会导致垃圾回收的过程缓慢,也就会导致主线程的等待时间越长,浏览器也就越长时间得不到响应
    1. V8的垃圾回收策略
      v8的内存结构由:新生代,老生代,大对象区,代码区,map区,垃圾回收过程主要出现在新生代和老生代。
      新生代:新生代的垃圾回收过程中主要采用了Scavenge算法。新生代内存一分为二,
      处于激活状态的区域我们称为From空间,未激活(inactive new space)的区域我们称为To空间。
      这两个空间中,始终只有一个处于使用状态,另一个处于闲置状态。
      程序中声明的对象首先会被分配到From空间,当进行垃圾回收时,如果From空间中尚有存活对象,则会被复制到To空间进行保存,非存活的对象会被自动回收。当复制完成后,From空间和To空间完成一次角色互换,To空间会变为新的From空间,原来的From空间则变为To空间
      对象晋升到老生代:当一个对象在新生代经过多次复制之后依旧存活,那么它会被认为是一个生命周期较长的对象,在下一次进行垃圾回收时,该对象会被直接转移到老生代中,这种对象从新生代转移到老生代的过程我们称之为晋升。
      对象晋升的条件主要有以下两个:
      对象是否经历过一次Scavenge算法
      To空间的内存占比是否已经超过25%
      老生代:采用Mark-Sweep(标记清除)和Mark-Compact(标记整理)来进行管理。
      为了减少垃圾回收带来的停顿时间,V8引擎又引入了Incremental Marking(增量标记)的概念,即将原本需要一次性遍历堆内存的操作改为增量标记的方式,先标记堆内存中的一部分对象,然后暂停,将执行权重新交给JS主线程,待主线程任务执行完毕后再从原来暂停标记的地方继续标记,直到标记完整个堆内存。V8引擎后续继续引入了延迟清理(lazy sweeping)和增量式整理(incremental)

    2. 如何防止内存泄露????
      1.避免使用全局遍历var,(原因:使用var全局对象挂在到window上,在标记阶段因为window对象可以作为根节点,在window上挂载的属性均可以被访问到,并将其标记为活动的从而常驻内存,因此也就不会被垃圾回收,只有在整个进程退出时全局作用域才会被销毁)全局变量使用完毕后将其设置为null从而触发回收机制。
      2.少用闭包
      3.手动关闭定时器
      4.使用弱引用

  • 相关阅读:
    CPP 核心编程9-STL
    使用 NSProxy 实现消息转发
    Hello Playwright:(3)基本概念
    阶段五-Day02-jQuery
    利用Scanorama高效整合异质单细胞转录组
    Flink-CDC-快速入手(MySQL为例)
    基于Java+控制台实现教材管理系统
    ​企业该如何做好源代码防泄密工作
    【Vue】单项数据流的理解
    js事件循环详解
  • 原文地址:https://blog.csdn.net/weixin_43801836/article/details/126043564