什么是JavaScript垃圾收集?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (8)
  • 关注 (0)
  • 查看 (86)

什么是JavaScript垃圾回收机制?为了编写更好的代码,Web程序员了解JavaScript垃圾回收机制有什么重要?

提问于
用户回答回答于

Eric Lippert博客帖子详细论述了这个问题(另外它与VBScript比较。更准确地说,他写的是JScript,这是微软自己的ECMAScript实现,尽管非常类似于JavaScript。我可以想象,对于InternetExplorer的JavaScript引擎来说,绝大多数行为都是相同的。当然,实现会因浏览器而异,尽管我怀疑您可以将许多常见原则应用于其他浏览器。

引用自该页:

JScript使用的是非通用标记和扫描垃圾回收机制。它的工作方式如下:

  • 每个变量都被称为“scavenger”。scavenger可以指一个数字,一个对象,一个字符串,可以是任何东西。我们维护一个scavenger列表--变量在进入作用域时被移到SCAV列表中,当它们超出作用域时被移出SCAV列表。
  • 在垃圾收集机制一直地运行。首先,它在每个对象、变量、字符串等上放置一个“标记”--GC跟踪的所有内存。(JScript在内部使用变体数据结构,而且该结构中有大量未使用的bits,因此我们只设置其中一个。)
  • 其次,它清除了scavenger上的标记和scavenger引用的传递闭包。因此,如果一个scavenger对象引用了一个非scavenger对象,那么我们就清除非scavenger上的位数,以及它所引用的所有内容。
  • 此时,我们知道仍然标记的所有内存都是分配的内存,任何范围内变量的任何路径都无法到达该内存。所有这些对象都被指示拆除自己,这会破坏任何循环引用。

垃圾收集的主要目的是允许程序员为了担心他们创建和使用的对象的内存管理,当然,有时也无法避免--至少对垃圾收集的工作方式有是有益的。

有几点需要特别注意。苹果开发者网站一些准则在这件事上。从那里有两个重要的:

  • 使用DELETE语句。每当使用新语句创建对象时,都要将其与DELETE语句配对。这确保与对象关联的所有内存(包括其属性名称)都可用于垃圾回收。DELETE语句在“释放对象”中有更多讨论。
  • 使用var关键字。任何没有var关键字创建的变量都是在全局范围内创建的,永远不符合垃圾收集的条件,这就提供了内存泄漏的机会。

我认为这些实践应该适用于所有JavaScript引擎(在不同的浏览器中),但是因为这是来自Apple站点的,所以它们也许要对Safari有一定的针对性。

热门问答

腾讯云广州一区DNS变更,需要怎么操作?

思潮澎湃轻描淡写的生活,但思潮澎湃
推荐
我也收到相关的通知了,这里分享下~ 2019年1月31日,腾讯云将对广州地区旧的基础网络DNS服务器(10.225.30.181、10.225.30.223)进行下线。在此期间,腾讯云提供最新的DNS服务器供您更新使用。 我们建议您尽快将DNS服务器配置进行更新,并且我们为您提供...... 展开详请

CMQ创建队列成功,紧接着发送消息,报队列不存在?

CreateQueue成功后,创建队列的时间为1s,您可以等待下在sendMessage

云呼叫中心只能用户自己开发吗?

腾讯云通信团队

腾讯 · 腾讯云通信团队 (已认证)

腾讯高级产品经理
推荐

目前呼叫中心只有API文档,需要用户自己开发。如果用户需要saas系统的呼叫中心可以使用智能外呼机器人:https://cloud.tencent.com/product/ccsr

ios端推流setRenderRotation无效?

西风

renzha.net · 站长 (已认证)

www.renzha.net
推荐

你有没有调整观众端表现,即通过对 LivePushConfig 中的homeOrientation设置项进行配置,它控制的是观众端看到的视频宽高比是16:9还是6:19,调整后的结果可以用播放器查看以确认是否符合预期。

腾讯云直播 CNAME 记录添加 的 值是多少???

西风

renzha.net · 站长 (已认证)

www.renzha.net
推荐
第一步:域名备案 控制台进行域名提交管理前,需对域名进行备案,详情请查看 域名备案 和 域名备案和配置常见问题 文档。 第二步:添加域名 在视频直播菜单栏内选择【域名管理】,在域名管理页面可以看到已创建域名、类型、状态、添加时间和操作。 可添加和管理的域名类型有播放域名和推流域...... 展开详请

【建议】【API】使用API创建子网的时候允许指定已有路由表?

推荐

控制台使用的是新的接口,批量创建子网,https://cloud.tencent.com/document/product/215/31960,可以指定路由表。terraform开发的时候是基于api2.0开发的,还没有这个接口,因此暂时无法使用

所属标签

扫码关注云+社区