Jadual Kandungan
垃圾回收
可触及(Reachability)
一个简单例子
两个引用
相互引用的对象
孤岛(Unreachable island)
内部算法
总结
Rumah hujung hadapan web tutorial js 浅谈一下js的垃圾回收的内容

浅谈一下js的垃圾回收的内容

Jul 16, 2018 am 09:42 AM
javascript Kutipan sampah

这篇文章主要介绍了关于js的垃圾回收机制,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

垃圾回收

内存管理于我们来说是自动的、不可见的。我们创建的原始类型、对象、函数等等,都会占用内存。

当它们不被需要之后会发生什么?JavaScript 引擎要如何发现并清除他们?

可触及(Reachability)

JavaScript 内存管理的关键概念是可触及(Reachability)

简单来说,“可触及”的值就是可访问的,可用的,他们被安全储存在内存。

  1. 以下是一些必定“可触及”的值,不管出于任何原因,都不能删除:

  • 当前函数的局部变量和参数。

  • 当前调用链(current chain of nested calls)中所有函数的局部变量和参数。

  • 全局变量。

  • (以及其他内部变量)

这些值都称为 *roots*。
Salin selepas log masuk
  1. 其他值是否可触及视乎它是否被 root 及其引用链引用。

    假设有一个对象存在于局部变量,它的值引用了另一个对象,如果这个对象是可触及的,则它引用的对象也是可触及的,后面会有详细例子。

JavaScript 引擎有一个 垃圾回收) 后台进程。它监控着所有对象,当对象不可触及时会将其删除。

一个简单例子

// user has a reference to the object
let user = {
  name: "John"
};
Salin selepas log masuk

2566786521-5b4b1e03a7eb8_articlex[1].png

箭头代表的是对象引用。全局变量 "user" 引用了对象{name: "John"}(简称此对象为 John)。John 的 "name" 属性储存的是一个原始值,所以无其他引用。

如果覆盖 user,对 John 的引用就丢失了:

user = null;
Salin selepas log masuk
Salin selepas log masuk

155327879-5b4b1e039f60c_articlex[1].png

现在 John 变得不可触及,垃圾回收机制会将其删除并释放内存。

两个引用

如果我们从 user 复制引用到 admin

// user has a reference to the object
let user = {
  name: "John"
};

*!*
let admin = user;
*/!*
Salin selepas log masuk

1546865928-5b4b1e038fe5e_articlex[1].png

如果重复一次这个操作:

user = null;
Salin selepas log masuk
Salin selepas log masuk

……这个对象是依然可以通过 admin 访问的,所以它依然存在于内存。如果我们把 admin 也覆盖为 null,那它就会被删除了。

相互引用的对象

这个例子比较复杂:

function marry(man, woman) {
  woman.husband = man;
  man.wife = woman;

  return {
    father: man,
    mother: woman
  }
}

let family = marry({
  name: "John"
}, {
  name: "Ann"
});
Salin selepas log masuk

marry 函数让两个参数对象互相引用,返回一个包含两者的新对象,结构如下:

1941061787-5b4b1e0308cd3_articlex[1].png

暂时所有对象都是可触及的,但我们现在决定移除两个引用:

delete family.father;
delete family.mother.husband;
Salin selepas log masuk

1604544661-5b4b1e030276c_articlex[1].png

只删除一个引用不会有什么影响,但是两个引用同时删除,我们可以看到 John 已经不被任何对象引用了:

4016353222-5b4b1e030b7a0_articlex[1].png

即使 John 还在引用别人,但是他不被别人引用,所以 John 现在已经是不可触及的了,它的存在将会被移除。

垃圾回收后:

2369010816-5b4b1e02ecc22_articlex[1].png

孤岛(Unreachable island)

也可能有一大堆互相引用的对象整块(像个孤岛)都不可触及了。

对上面的对象进行操作:

family = null;
Salin selepas log masuk

内存中的情况如下:

317280959-5b4b1e02da6a3_articlex[1].png

这个例子展示了“可触及”这个概念的重要性。

尽管 John 和 Ann 互相依赖,但这仍不足够。

"family" 对象整个已经切断了与 root 的连接,没有任何东西引用到这里,所以这个孤岛遥不可及,只能等待被删除。

内部算法

基础的垃圾回收算法被称为“标记-清除算法”("mark-and-sweep"):

  • 垃圾回收器获取并标记 root。

  • 然后访问并标记来自他们的所有引用。

  • 访问被标记的对象,标记他们的引用。所有被访问过的对象都会被记录,以后将不会重复访问同一对象。

  • ……直到只剩下未访问的引用。

  • 所有未被标记的对象都会被移除。

假设对象结构如下:

862819114-5b4b1e0218952_articlex[1].png

我们清晰地看到右边的“孤岛”。现在使用“标记-清除”的方法处理他。

第一步,标记 root:

3725254996-5b4b1e0218f2b_articlex[1].png

然后标记他们的引用:

3567439851-5b4b1e022afb7_articlex[1].png

……标记他们引用的引用:

464038720-5b4b1e0226abc_articlex[1].png

现在没有被访问过的对象会被认为是不可触及,他们将会被删除:

2993400725-5b4b1e022dacc_articlex[1].png

这就是垃圾回收的工作原理。

JavaScript 引擎在不影响执行的情况下做了很多优化,使这个过程更垃圾回收效率更高:

  • 分代收集 -- 对象会被分为“新生代”和“老生代”。很多对象完成任务后很快就不再需要了,所以对于他们的清理可以很频繁。而在清理中留下的称为“老生代”一员。

  • 增量收集 -- 如果对象很多,很难一次标记完所有对象,这个过程甚至对程序执行产生了明显的延迟。所以引擎会尝试把这个操作分割成多份,每次执行一份。这样做要记录额外的数据,但是可以有效降低延迟对用户体验的影响。

  • 闲时收集 -- 垃圾回收器尽量只在 CPU 空闲时运行,减少对程序执行的影响。

除此以外还有很多对垃圾回收的优化,在此就不详细说了,各个引擎有自己的调整和技术,而且这个东西一直随着引擎的更新换代在改变,如果不是有实在的需求,不值得挖太深。不过如果你真的对此有浓厚的兴趣,下面会为你提供一些拓展链接。

总结

重点:

  • 垃圾回收自动进行,我们不能强制进行或阻止他。

  • 可触及的对象会被保留在内存中。

  • 被引用不一定是可触及的(从 root):相互引用的对象可能整块都是不可触及的。

现代引擎实现了加强版的垃圾回收算法,《The Garbage Collection Handbook: The Art of Automatic Memory Management》(R. Jones 等)一书中提及了他们。

如果你熟悉底层编程,可以阅读 A tour of V8: Garbage Collection 了解更多关于 V8 垃圾回收的细节。

V8 blog 也会经常发布一些关于内存管理的文章。学习垃圾回收算法最好还是先学习 V8 的实现,阅读 Vyacheslav Egorov(V8 工程师之一)的博客。我说 V8 是因为在互联网上关于 V8 的文章比较多。对于其他引擎,很多实现都是相似的,但是垃圾回收算法上区别不少。

对引擎的深入理解在做底层优化的时候很有帮助。在你熟悉一门语言之后,这是一个明智的研究方向。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何通过js判断页面在pc端打开还是移动端打开

对JS中的prototype的详解

Atas ialah kandungan terperinci 浅谈一下js的垃圾回收的内容. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan sistem pengecaman pertuturan dalam talian menggunakan WebSocket dan JavaScript Bagaimana untuk melaksanakan sistem pengecaman pertuturan dalam talian menggunakan WebSocket dan JavaScript Dec 17, 2023 pm 02:54 PM

Cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian Pengenalan: Dengan perkembangan teknologi yang berterusan, teknologi pengecaman pertuturan telah menjadi bahagian penting dalam bidang kecerdasan buatan. Sistem pengecaman pertuturan dalam talian berdasarkan WebSocket dan JavaScript mempunyai ciri kependaman rendah, masa nyata dan platform merentas, dan telah menjadi penyelesaian yang digunakan secara meluas. Artikel ini akan memperkenalkan cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian.

WebSocket dan JavaScript: teknologi utama untuk melaksanakan sistem pemantauan masa nyata WebSocket dan JavaScript: teknologi utama untuk melaksanakan sistem pemantauan masa nyata Dec 17, 2023 pm 05:30 PM

WebSocket dan JavaScript: Teknologi utama untuk merealisasikan sistem pemantauan masa nyata Pengenalan: Dengan perkembangan pesat teknologi Internet, sistem pemantauan masa nyata telah digunakan secara meluas dalam pelbagai bidang. Salah satu teknologi utama untuk mencapai pemantauan masa nyata ialah gabungan WebSocket dan JavaScript. Artikel ini akan memperkenalkan aplikasi WebSocket dan JavaScript dalam sistem pemantauan masa nyata, memberikan contoh kod dan menerangkan prinsip pelaksanaannya secara terperinci. 1. Teknologi WebSocket

Cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata Cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata Dec 17, 2023 pm 12:09 PM

Pengenalan kepada cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata: Dengan populariti Internet dan kemajuan teknologi, semakin banyak restoran telah mula menyediakan perkhidmatan pesanan dalam talian. Untuk melaksanakan sistem pesanan dalam talian masa nyata, kami boleh menggunakan teknologi JavaScript dan WebSocket. WebSocket ialah protokol komunikasi dupleks penuh berdasarkan protokol TCP, yang boleh merealisasikan komunikasi dua hala masa nyata antara pelanggan dan pelayan. Dalam sistem pesanan dalam talian masa nyata, apabila pengguna memilih hidangan dan membuat pesanan

Apakah hubungan antara teknik pengurusan memori dan keselamatan dalam fungsi Java? Apakah hubungan antara teknik pengurusan memori dan keselamatan dalam fungsi Java? May 02, 2024 pm 01:06 PM

Pengurusan memori dalam Java melibatkan pengurusan memori automatik, menggunakan pengumpulan sampah dan pengiraan rujukan untuk memperuntukkan, menggunakan dan menuntut semula memori. Pengurusan memori yang berkesan adalah penting untuk keselamatan kerana ia menghalang limpahan penimbal, petunjuk liar dan kebocoran memori, dengan itu meningkatkan keselamatan program anda. Contohnya, dengan melepaskan objek yang tidak lagi diperlukan dengan betul, anda boleh mengelakkan kebocoran memori, dengan itu meningkatkan prestasi program dan mencegah ranap sistem.

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Dec 17, 2023 pm 05:13 PM

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Pengenalan: Hari ini, ketepatan ramalan cuaca sangat penting kepada kehidupan harian dan membuat keputusan. Apabila teknologi berkembang, kami boleh menyediakan ramalan cuaca yang lebih tepat dan boleh dipercayai dengan mendapatkan data cuaca dalam masa nyata. Dalam artikel ini, kita akan mempelajari cara menggunakan teknologi JavaScript dan WebSocket untuk membina sistem ramalan cuaca masa nyata yang cekap. Artikel ini akan menunjukkan proses pelaksanaan melalui contoh kod tertentu. Kami

Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Jan 05, 2024 pm 06:08 PM

Tutorial JavaScript: Bagaimana untuk mendapatkan kod status HTTP, contoh kod khusus diperlukan: Dalam pembangunan web, interaksi data dengan pelayan sering terlibat. Apabila berkomunikasi dengan pelayan, kami selalunya perlu mendapatkan kod status HTTP yang dikembalikan untuk menentukan sama ada operasi itu berjaya dan melaksanakan pemprosesan yang sepadan berdasarkan kod status yang berbeza. Artikel ini akan mengajar anda cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan menyediakan beberapa contoh kod praktikal. Menggunakan XMLHttpRequest

Bagaimana untuk mendapatkan kod status HTTP dalam JavaScript dengan cara yang mudah Bagaimana untuk mendapatkan kod status HTTP dalam JavaScript dengan cara yang mudah Jan 05, 2024 pm 01:37 PM

Pengenalan kepada kaedah mendapatkan kod status HTTP dalam JavaScript: Dalam pembangunan bahagian hadapan, kita selalunya perlu berurusan dengan interaksi dengan antara muka bahagian belakang, dan kod status HTTP adalah bahagian yang sangat penting daripadanya. Memahami dan mendapatkan kod status HTTP membantu kami mengendalikan data yang dikembalikan oleh antara muka dengan lebih baik. Artikel ini akan memperkenalkan cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan memberikan contoh kod khusus. 1. Apakah kod status HTTP bermakna kod status HTTP apabila penyemak imbas memulakan permintaan kepada pelayan, perkhidmatan tersebut

Petua pengoptimuman prestasi Python CPython Petua pengoptimuman prestasi Python CPython Mar 06, 2024 pm 06:04 PM

Python digunakan secara meluas dalam pelbagai bidang dan sangat dihormati kerana kemudahan penggunaan dan fungsi yang berkuasa. Walau bagaimanapun, prestasinya boleh menjadi halangan dalam beberapa kes. Melalui pemahaman yang mendalam tentang mesin maya CPython dan beberapa teknik pengoptimuman yang bijak, kecekapan menjalankan program Python boleh dipertingkatkan dengan ketara. 1. Fahami mesin maya CPython CPython ialah pelaksanaan Python yang paling popular, yang menggunakan mesin maya (VM) untuk melaksanakan kod Python. VM mentafsir kod bait ke dalam arahan mesin, yang akan menyebabkan overhed masa tertentu. Memahami cara VM berfungsi membantu kami mengenal pasti dan mengoptimumkan kesesakan prestasi. 2. Pengumpulan sampah Python menggunakan mekanisme pengiraan rujukan untuk kutipan sampah, tetapi ia boleh menyebabkan kutipan sampah terhenti secara berkala

See all articles