Rumah > hujung hadapan web > tutorial js > Analisis mendalam tentang mekanisme kutipan sampah di JS

Analisis mendalam tentang mekanisme kutipan sampah di JS

青灯夜游
Lepaskan: 2023-03-02 19:31:13
ke hadapan
1586 orang telah melayarinya

Jenis asas disimpan pada tindanan, dan jenis rujukan disimpan pada timbunan. JavaScript secara automatik memperuntukkan memori apabila pembolehubah (objek, rentetan, dll.) dicipta dan "secara automatik" mengeluarkannya apabila ia tidak digunakan. Proses pelepasan dipanggil kutipan sampah.

Analisis mendalam tentang mekanisme kutipan sampah di JS

Strategi kutipan sampah

Tugas yang perlu dilakukan oleh semua pemungut sampah

  • Tandai objek aktif (hidup) dan objek tidak aktif (bukan hidup) dalam ruang

  • Kitar semula atau gunakan semula memori yang diduduki oleh objek tidak aktif

  • Organisasi memori untuk mengelakkan berlakunya pemecahan memori

Apakah objek sampah?

Secara umumnya, objek yang tidak dirujuk adalah sampah dan mesti dibersihkan. Melintasi objek bermula dari akar.

Pengecualian
Jika beberapa rujukan objek membentuk cincin dan merujuk antara satu sama lain, tetapi akarnya tidak dapat mengaksesnya, objek ini juga sampah dan mesti dibersihkan.

Apakah objek akar dan objek hidup

Objek akar
mempunyai set asas yang boleh dicapai secara semula jadi nilai , atas sebab yang jelas tidak boleh dipadamkan

  • objek global tetingkap pembolehubah global, objek akar pokok dokumen DOM, dll.

objek hidup
Nilai dianggap boleh diakses jika rujukan atau rantai rujukan boleh mengakses sebarang nilai lain daripada akar

Kaedah kitar semula generasi kitar semula enjin V8

Bagi timbunan kepada generasi baru dan generasi lama.
Generasi baharu menyimpan objek dengan jangka hayat yang pendek, dan generasi lama menyimpan objek dengan jangka hayat yang panjang.

Algoritma penyalinan pengumpul sampah generasi baharu

membahagikan ingatan timbunan kepada dua bahagian, satu ialah penggunaan kawasan , ruang yang digunakan; yang lain ialah kawasan bebas, ruang dalam keadaan terbiar.

  • Objek yang baru ditambah akan disimpan dalam kawasan penggunaan Apabila kawasan penggunaan hampir penuh, sampah perlu Operasi pembersihan.

  • Pengumpul sampah generasi baharu akan menandakan objek aktif dalam kawasan penggunaan Selepas penandaan selesai, akan menyalin objek aktif dalam gunakan kawasan ke kawasan bebas . Menyelesaikan masalah blok memori bertaburan.

  • Bersihkan ruang yang diduduki oleh objek tidak aktif dalam kawasan penggunaan. Akhirnya, peranan diterbalikkan, kawasan penggunaan asal menjadi kawasan bebas baharu, dan kawasan bebas asal menjadi kawasan penggunaan baharu.

Objek dipindahkan ke generasi lama

  • Jika sesuatu objek masih bertahan selepas disalin berkali-kali, ia akan dianggap mempunyai kitaran hayat yang panjang Objek yang panjang kemudiannya dipindahkan ke generasi lama.
  • Apabila menyalin objek ke kawasan bebas dan menduduki lebih daripada 25% kawasan bebas, objek itu akan terus dipromosikan ke ruang generasi lama. Sebabnya ialah kawasan bebas asal akan menjadi kawasan terpakai baharu, dan peruntukan memori objek akan diteruskan Jika nisbah terlalu tinggi, ruang yang tersedia untuk objek baharu akan menjadi terlalu sedikit.

Kitar semula selari pengoptimuman generasi baharu

Masalah jeda penuh
JavaScript ialah satu benang Dijalankan pada utas utama, pelaksanaan skrip JavaScript akan disekat semasa pengumpulan sampah Anda perlu menunggu pengumpulan sampah selesai sebelum meneruskan pelaksanaan skrip.

Jika GC mengambil masa terlalu lama, ia boleh menyebabkan halaman menjadi beku.

Mekanisme kitar semula selari
Semasa pelaksanaan pemungut sampah pada utas utama, beberapa utas tambahan dimulakan untuk melakukan kerja kitar semula yang sama pada masa yang sama.

Analisis mendalam tentang mekanisme kutipan sampah di JS

Pengumpulan sampah generasi lama

Masalah menggunakan kaedah scavenge
1. Objek hidup Jika terdapat terlalu banyak, penyalinan objek yang masih hidup secara kerap akan mengurangkan kecekapan
2. Bazirkan separuh daripada ruang

Terutamanya gunakan kaedah tanda-jelas Apabila peruntukan memori tidak mencukupi , gunakan mark-organize Kaedah

Algoritma yang digunakan dalam tempoh pengumpulan sampah generasi lama
1. Mula-mula gunakan mark-sweep untuk melengkapkan kitar semula ruang sampah; . Gunakan mark-sweep untuk pengoptimuman ruang; atur algoritma

menyalin hanya menyalin objek hidup, manakala mark-clear hanya mengosongkan objek mati.

Objek hidup hanya menyumbang sebahagian kecil daripada generasi baharu, dan objek mati hanya menyumbang sebahagian kecil daripada generasi lama Inilah sebabnya kedua-dua kaedah kitar semula boleh diproses dengan cekap . Kelemahan

Terlalu banyak pemecahan memori. Jika memori yang besar perlu diperuntukkan, kutipan sampah akan dicetuskan lebih awal kerana ruang berpecah-belah yang tinggal tidak mencukupi untuk melengkapkan peruntukan, dan kutipan ini tidak diperlukan.

-> Algoritma penyusunan tanda Selepas menandakan objek yang masih hidup, gerakkan objek yang masih hidup ke satu hujung ruang memori Selepas pergerakan selesai, kosongkan semua memori di luar sempadan

V8 telah mengoptimumkan pengumpul sampah generasi lama, bertukar daripada penandaan jeda penuh kepada penandaan tambahan .

Tukar kutipan sampah kepada tempoh singkat kutipan sampah GC

Jika strategi penandaan hitam dan putih (hidup dan mati) diguna pakai, maka pemungut sampah melaksanakan kenaikan Selepas kitar semula, utas utama didayakan selepas jeda untuk melaksanakan sekeping kod JavaScript dalam aplikasi Kemudian apabila pengumpul sampah dimulakan semula, terdapat hitam dan putih dalam ingatan, dan kami tidak tahu ke mana hendak pergi seterusnya

.

Pembersihan malas
Pembersihan malas bermula selepas penandaan tambahan selesai. Apabila penandaan tambahan selesai, jika memori yang tersedia semasa cukup untuk kita melaksanakan kod dengan cepat, kita sebenarnya tidak perlu membersihkan memori dengan segera Kita boleh melambatkan sedikit proses pembersihan dan membiarkan kod skrip JavaScript dijalankan terlebih dahulu. Tidak perlu membersihkan semua sekali gus Selepas semua memori objek yang tidak aktif dikosongkan, anda boleh membersihkannya satu persatu mengikut keperluan sehingga semua memori objek tidak aktif dikosongkan, dan kemudian melakukan penandaan tambahan
Analisis mendalam tentang mekanisme kutipan sampah di JS

kaedah penandaan tiga warna Jeda dan sambung semula

Kendalian tanda kaedah penandaan tiga warna boleh dilaksanakan secara beransur-ansur tanpa mengimbas keseluruhan ruang memori setiap kali, dan boleh dipadankan dengan baik dengan kitar semula tambahan untuk jeda dan operasi pemulihan, dengan itu mengurangkan masa jeda penuh

Putih: Objek tidak bertandaKelabu: Itu sendiri ditanda, dan. objek rujukan objek ini tidak ditanda

Hitam: Kedua-dua objek itu sendiri dan objek rujukan objek (objek yang ditunjuk oleh anak panah) ditandakan

  • Bermula daripada sekumpulan objek akar,
  • mula-mula bahagikan kumpulan ini Objek akar ditanda kelabu dan ditolak ke dalam lembaran kerja penandaan Apabila pengitar semula memaparkan objek dari lembaran kerja penandaan dan mengakses objek rujukannya, ia menukar dirinya daripada kelabu. kepada hitam dan menukar objek rujukan seterusnya adalah kelabu
  • dan teruskan ke bawah sehingga tiada objek yang boleh ditandakan sebagai kelabu, iaitu tiada objek yang boleh dicapai objek putih tidak dapat dicapai, iaitu Menunggu untuk dikitar semula.

Gunakan sama ada terdapat nod kelabu dalam memori semasa untuk menentukan sama ada keseluruhan tanda telah selesai Jika tiada nod kelabu, masukkan terus fasa pembersihan Jika masih terdapat tanda kelabu, teruskan pelaksanaan terus dari nod kelabu semasa pemulihan Anda boleh Analisis mendalam tentang mekanisme kutipan sampah di JS

menulis halangan

Selepas jeda blok tanda GC yang lengkap, program tugasan dilaksanakan dan hubungan rujukan objek diubah suai.

Andaikan bahawa dalam segmentasi tambahan pertama, semua ABC ditandakan hitam, dan kemudian skrip JavaScript dilaksanakan, B->D, untuk memulakan segmentasi tambahan kedua. Objek baharu D pada mulanya berwarna putih, tetapi tiada objek kelabu pada masa ini, bermakna semua penandaan telah selesai dan pembersihan D akan dikitar semula semasa fasa pembersihan. Ini tidak betul. V8 memperkenalkan mekanisme penghalang tulis Setelah objek hitam merujuk objek putih, mekanisme ini akan menukar objek putih yang dirujuk menjadi kelabu
.


Analisis mendalam tentang mekanisme kutipan sampah di JS

Kitar semula serentak


Kitar semula selari menyekat benang utama

Tanda kenaikan meningkatkan jumlah masa jeda, Kurangkan penggunaan throughputSemasa utas utama sedang melaksanakan JavaScript, utas tambahan boleh melengkapkan operasi pengumpulan sampah di latar belakang
  • [Pembelajaran yang disyorkan:
  • Lanjutan Tutorial JavaScript
  • ]

Atas ialah kandungan terperinci Analisis mendalam tentang mekanisme kutipan sampah di JS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan