浅谈一下js的垃圾回收的内容
这篇文章主要介绍了关于js的垃圾回收机制,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
垃圾回收
内存管理于我们来说是自动的、不可见的。我们创建的原始类型、对象、函数等等,都会占用内存。
当它们不被需要之后会发生什么?JavaScript 引擎要如何发现并清除他们?
可触及(Reachability)
JavaScript 内存管理的关键概念是可触及(Reachability)。
简单来说,“可触及”的值就是可访问的,可用的,他们被安全储存在内存。
以下是一些必定“可触及”的值,不管出于任何原因,都不能删除:
当前函数的局部变量和参数。
当前调用链(current chain of nested calls)中所有函数的局部变量和参数。
全局变量。
(以及其他内部变量)
这些值都称为 *roots*。
-
其他值是否可触及视乎它是否被 root 及其引用链引用。
假设有一个对象存在于局部变量,它的值引用了另一个对象,如果这个对象是可触及的,则它引用的对象也是可触及的,后面会有详细例子。
JavaScript 引擎有一个 垃圾回收) 后台进程。它监控着所有对象,当对象不可触及时会将其删除。
一个简单例子
// user has a reference to the object let user = { name: "John" };
箭头代表的是对象引用。全局变量 "user"
引用了对象{name: "John"}
(简称此对象为 John)。John 的 "name"
属性储存的是一个原始值,所以无其他引用。
如果覆盖 user
,对 John 的引用就丢失了:
user = null;
现在 John 变得不可触及,垃圾回收机制会将其删除并释放内存。
两个引用
如果我们从 user
复制引用到 admin
:
// user has a reference to the object let user = { name: "John" }; *!* let admin = user; */!*
如果重复一次这个操作:
user = null;
……这个对象是依然可以通过 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" });
marry
函数让两个参数对象互相引用,返回一个包含两者的新对象,结构如下:
暂时所有对象都是可触及的,但我们现在决定移除两个引用:
delete family.father; delete family.mother.husband;
只删除一个引用不会有什么影响,但是两个引用同时删除,我们可以看到 John 已经不被任何对象引用了:
即使 John 还在引用别人,但是他不被别人引用,所以 John 现在已经是不可触及的了,它的存在将会被移除。
垃圾回收后:
孤岛(Unreachable island)
也可能有一大堆互相引用的对象整块(像个孤岛)都不可触及了。
对上面的对象进行操作:
family = null;
内存中的情况如下:
这个例子展示了“可触及”这个概念的重要性。
尽管 John 和 Ann 互相依赖,但这仍不足够。
"family"
对象整个已经切断了与 root 的连接,没有任何东西引用到这里,所以这个孤岛遥不可及,只能等待被删除。
内部算法
基础的垃圾回收算法被称为“标记-清除算法”("mark-and-sweep"):
垃圾回收器获取并标记 root。
然后访问并标记来自他们的所有引用。
访问被标记的对象,标记他们的引用。所有被访问过的对象都会被记录,以后将不会重复访问同一对象。
……直到只剩下未访问的引用。
所有未被标记的对象都会被移除。
假设对象结构如下:
我们清晰地看到右边的“孤岛”。现在使用“标记-清除”的方法处理他。
第一步,标记 root:
然后标记他们的引用:
……标记他们引用的引用:
现在没有被访问过的对象会被认为是不可触及,他们将会被删除:
这就是垃圾回收的工作原理。
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中文网!
相关推荐:
Atas ialah kandungan terperinci 浅谈一下js的垃圾回收的内容. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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 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

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

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 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: 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

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

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
