• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
时光里的赶路人
博客园    首页    新随笔    联系   管理    订阅  订阅
前端面试题-js-垃圾回收(四)

1.垃圾回收

对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。

可达性(Reachability)

JavaScript 中主要的内存管理概念是 可达性。

简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。

  1. 这里列出固有的可达值的基本集合,这些值明显不能被释放。

    比方说:

    • 当前执行的函数,它的局部变量和参数。
    • 当前嵌套调用链上的其他函数、它们的局部变量和参数。
    • 全局变量。
    • (还有一些内部的)

    这些值被称作 根(roots)。

  2. 如果一个值可以通过引用链从根访问任何其他值,则认为该值是可达的。

    比方说,如果全局变量中有一个对象,并且该对象有一个属性引用了另一个对象,则 该 对象被认为是可达的。而且它引用的内容也是可达的。

在 JavaScript 引擎中有一个被称作 垃圾回收器 的东西在后台执行。它监控着所有对象的状态,并删除掉那些已经不可达的。

垃圾回收算法:

JavaScript具有自动垃圾收集机制,也就是说,执行环境将负责管理代码执行过程中使用的内存。

在JavaScript中,如果一个对象不再被引用,那么这个对象就会被垃圾回收器回收,当对象被回收之后,这块内存就可以被再次使用。

JavaScript有两种垃圾回收机制:

1. 标记清除(Mark-and-sweep):这是JavaScript中最常见的垃圾收集方式,当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。

2. 引用计数(Reference counting):引用计数是另一种垃圾回收策略,引用计数的含义是跟踪每个值被引用的次数。当声明了一个变量并将一个引用类型值赋值给该变量时,这个值的引用次数就是1。如果同一个值又被赋值给另一个变量,那么这个值的引用次数就增加了1。相反,如果包含对这个值引用的变量又取得了另外一个值,那么这个值的引用次数就减少1。当这个值的引用次数变为0时,说明没有办法访问这个值了,因此就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次运行时,它就会释放那些引用次数为0的值所占用的内存。

这两种方式都有自己的优缺点,但标记清除是目前主流的垃圾回收方式,主要的原因是它不会导致循环引用的问题。

面试的时候,JavaScript的垃圾回收怎么回答?

JavaScript的垃圾回收是一种自动化的内存管理机制,用于帮助我们管理内存中不再使用的对象,以便释放内存空间供其他对象使用。当一个对象不再被引用时,垃圾回收机制会自动将其标记为"垃圾",然后在适当的时机进行回收和释放内存。

在面试时,你可以回答以下几个方面来解释JavaScript的垃圾回收:

1.引用计数:这是一种最早的垃圾回收算法,在JavaScript中并未广泛使用。它通过对每个对象记录引用数来决定对象是否为垃圾。当引用数为时,对象即被判定为垃圾,并被回收。然而,该算法存在循环引用的问题,循环引用的对象无法被回收。

2.标记-清除算法:这是JavaScript中最常用的垃圾回收算法。它通过从根对象开始进行遍历,标记所有能够访问到的对象,然后清除掉未被标记的对象,即垃圾对象。这个过程可以通过JavaScript解释器中的垃圾回收器自动执行。

3.并行和增量回收:为了提高垃圾回收的效率,现代浏览器通常采用并行和增量回收策略。并行回收利用多个线程来同时执行垃圾回收,减少回收过程对主线程的阻塞时间。增量回收则将垃圾回收过程分成多个小步骤,在执行每个小步骤之间允许主线程执行其他任务,从而减少垃圾回收对整体性能的影响。

4.内存泄漏:虽然JavaScript具有自动垃圾回收机制,但仍然存在内存泄漏的可能性。内存泄漏指当不再需要使用的对象仍然被引用时,垃圾回收器无法将其回收,导致内存使用量持续增加。常见的内存泄漏原因包括未及时释放事件监听器、闭包中的变量引用等。在开发过程中,需要注意及时释放不再使用的对象,避免内存泄漏问题。

 总结:

垃圾回收简要回答:

(1)垃圾回收是JavaScript引擎的一种自动内存管理机制,主要负责找出那些不再继续使用的变量或对象,并释放其占用的内存。JavaScript中的垃圾回收主要基于“标记-清除”和“引用计数”两种策略。

(2)“标记-清除”是最常见的垃圾回收方式。它的工作原理是,垃圾回收机制定时运行,查找并标记所有活动对象,然后清除掉那些没有被标记的对象占用的内存。

(3)“引用计数”是另一种垃圾回收方式。它的工作原理是,每当引用关系改变时,如赋值或参数传递等,就修改引用计数。当某个对象的引用计数变为0时,就立即释放其占用的内存。

(4)JavaScript的垃圾回收是自动进行的,无需开发者手动操作,但了解这个过程对编写高效、优秀的JavaScript代码是十分有必要的。

posted on 2023-07-12 10:15  吹风哪页就哪页  阅读(246)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3