美文网首页
js的内存和垃圾回收机制

js的内存和垃圾回收机制

作者: small_Axe | 来源:发表于2021-12-02 08:56 被阅读0次

内存和垃圾回收

1. v8内存大小限制

在Node中如果通过JavaScript使用内存操作时会发现实际只能使用部分内存(64位系统下约为1.4G,32位系统下约为0.7G),这种限制对于其他的服务端开发语言来说基本上都是不存在的。

  • 和操作系统有关:64位为1.4G,32位为0.7G
  • 64位下新生代的空间为64MB,老生代为1400MB
  • 32位下新生代的空间为16MB,老生代为700MB
    而V8的这种限制导致的结果是Node无法直接操作大内存对象。在单个Node进程的情况下,计算机的内存资源无法得到充足的使用。

而问题的原因在于Node是基于V8构建,所以在Node中使用对象都是通过V8自己的方式进行分配和管理。

而其内存管理机制在浏览器的场景下问题不大,但是对于Node,却使得Node有了这般限制。

为什么?

  • JavaScript 是脚本语言,它不像c,java,php一样有很多内容持久性的保存在内存中,脚本语言只执行一次,执行完毕就会释放内存,1.4G足够用。
  • 如果不给限制会有什么问题。v8回收一次垃圾 100mb => 3ms, 看似3ms没什么问题,但是有个问题是,v8在回收的时候是暂停所有代码执行的。

2. v8的内存分配

内存分配

新生代和老生代

  • 所谓新生代,指的是新产生的对象;
  • 老生代就是经历过新生代垃圾回收后还“存活”下来的对象。

新生代 => 老生代

  • 这个变量经历过内存回收。
  • 新生代内存一旦使用了25%。

新生代垃圾回收算法 Scavenge GC:

  1. 我们把新生代对象的内存平均分开 2 份空间From 和 To
  2. 每当有新生对象诞生,就会在 From 空间出现
  3. 一旦 From 空间被占满,就触发 Scavenge GC
  4. 从 From 空间拿出存活的对象,复制到 To 空间
  5. 清空 From 空间 (这样就可以实现把不活跃的对象给回收掉)
  6. From To 空间角色互换,开始下一轮循环

还有一种情况,当复制到 To 空间的时候, To 空间已经使用了25%,那么这个对象直接晋升到老生代区。

老生代垃圾回收算法

老生代中用标记 - 清除(Mark-Sweep)的算法来处理。
首先是标记过程阶段,标记阶段就是从一组根元素开始,递归遍历这组根元素(遍历调用栈),在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据.然后在遍历过程中标记,标记完成后就进行清除过程。它和副垃圾回收器的垃圾清除过程完全不同,这个的清除过程是删除标记数据。

清除算法后,会产生大量不连续的内存碎片。而碎片过多会导致大对象无法分配到足够的连续内存,于是又产生了标记 - 整理(Mark-Compact)算法,这个标记过程仍然与标记 - 清除算法里的是一样的,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,从而让存活对象占用连续的内存块。

3. 内存如何回收

回收

;

查看内存

容易引发内存使用不当的情景

  • 滥用全局变量
    • 使用后及时释放内存,将变量赋值为undefined或者null;
  • 缓存不限制
    • 缓存限制内存大小
  • 操作大文件
    • 断点续传,切片上传

相关文章

  • 2018-10-13

    浅谈浏览器的垃圾回收机制和内存泄露 JavaScript使用垃圾回收机制来自动管理内存。 JS的回收机制分两种:1...

  • JavaScript内存管理

    JS内存回收 JS 有自动垃圾回收机制,就是找出那些不再继续使用的值,然后释放其占用的内存。 垃圾回收算法: 引用...

  • 前端面试-JS垃圾回收机制

    什么是垃圾回收机制? JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在...

  • 垃圾回收机制

    概述 JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制...

  • JS 里垃圾回收机制是什么,常用的是哪种,怎么处理的?

    JS 的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是...

  • Javascript垃圾回收机制

    简介 JS自带一套内存管理引擎,负责创建对象、销毁对象,以及垃圾回收。这期探讨一下垃圾回收机制。垃圾回收机制主要是...

  • JS中的基本数据类型与所在内存空间那些事

    一、内存空间 为了便于理解,我们暂且先将Js的内存分为栈内存和堆内存。 JavaScript具有垃圾自动回收机制,...

  • JS的内存泄漏垃圾回收

    一.垃圾回收 JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃...

  • 闭包的理解。

    js的垃圾回收机制 当一个函数执行完,js引擎会回收不再使用的内存,闭包通过这个作用域的引用,阻止了垃圾回收。 什...

  • JS垃圾回收机制(内存问题)

    垃圾收集机制理解 垃圾收集机制:释放无用的数据,回收内存。 垃圾收集机制分类:1)自动回收 2)手动回收 垃圾收集...

网友评论

      本文标题:js的内存和垃圾回收机制

      本文链接:https://www.haomeiwen.com/subject/zahyxrtx.html