浅谈 js 内存管理

作者: 赵永盛 | 来源:发表于2019-06-07 23:41 被阅读3次

js 内存是由 GC 自动管理的

内存生命周期:

不管什么程序语言,内存生命周期基本是一致的:

  • 分配你所需要的内存
  • 使用分配到的内存(读、写)
  • 不需要时将其释放\归还
回收算法:
  • 引用计数
  • 标记-清除 算法
引用计数:

这是最初级的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。

但是引用计数有个缺点,无法处理 循环引用:


类似这种循环引用,因为至少存在一处引用计数,所以无法被GC 回收,多的话可能导致内存溢出

标记-清除 算法:

这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。

这个算法假定设置一个叫做根(root)的对象(在Javascript里,根是全局对象)。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。

这个算法比前一个要好,因为“有零引用的对象”总是不可获得的,但是相反却不一定,参考“循环引用”。

从2012年起,所有现代浏览器都使用了标记-清除垃圾回收算法。所有对JavaScript垃圾回收算法的改进都是基于标记-清除算法的改进,并没有改进标记-清除算法本身和它对“对象是否不再需要”的简化定义。

循环引用不再是问题了

在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。

限制: 那些无法从根对象查询到的对象都将被清除

尽管这是一个限制,但实践中我们很少会碰到类似的情况,所以开发者不太会去关心垃圾回收机制。

参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management)

相关文章

  • 浅谈 js 内存管理

    js 内存是由 GC 自动管理的 内存生命周期: 不管什么程序语言,内存生命周期基本是一致的: 分配你所需要的内存...

  • 2018-10-13

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

  • 浅谈js内存

    本文是lhyt本人原创,希望用通俗易懂的方法来理解一些细节和难点。转载时请注明出处。文章最早出现于本人github...

  • Node.js内存管理机制分享

    Node.js内存管理Node.js的一些选项GC研究例子生产环境的设置 1. Node.js如何管理内存 [解惑...

  • JavaScript到底怎么回收垃圾的?

    浅谈JavaScript的内存管理与垃圾回收机制。 诸如 C 语言这般的低级语言一般都有低级的内存管理接口,比如 ...

  • 浅谈WKWebView使用、JS的交互

    浅谈WKWebView使用、JS的交互 浅谈WKWebView使用、JS的交互

  • js内存管理

    导读:js是高级语言,有自带的垃圾回收器,一般认为js开发可以不用关心内存管理。然而这是错误的。 js垃圾回收算法...

  • JS内存管理

    v8作为javascirpt引擎,对变量的存储主要有两种位置:栈存储和堆存储 栈内存:存储 基本类型的变量:如Nu...

  • js内存管理

    1.内存管理的宗旨就是避免大量JavaScript的网页耗尽系统内存导致系统奔溃。因此再优化内存的时候,要保证执行...

  • js 执行上下文,作用域,变量内存管理

    js 执行上下文,作用域,变量内存管理 JS中变量的定义在内存中包括三个部分:* 变量标示(变量标示存储在内存的栈...

网友评论

    本文标题:浅谈 js 内存管理

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