Apakah Javascript mengalami kebocoran memori ? Jika ya, bagaimana cara menghindarinya? Mengingat fakta bahwa beberapa orang telah menanyakan pertanyaan serupa kepada saya baru-baru ini, tampaknya belum ada yang mempelajari bagian konten ini secara sistematis. Oleh karena itu, saya berencana untuk berbagi dengan Anda beberapa informasi yang saya kumpulkan beberapa tahun yang lalu.
Pertama-tama, dapat dikatakan dengan pasti bahwa beberapa cara penulisan JavaScript akan menyebabkan kebocoran memori, setidaknya di IE6. Oleh karena itu, saat ini ketika IE6 menolak untuk pensiun, kita masih perlu memahami pengetahuan yang relevan (walaupun dalam banyak kasus, kebocoran memori yang disebabkan oleh js bukanlah alasan utama memperlambat komputer). Penelitian terkait sebagian besar terkonsentrasi pada tahun 2005-07. Artikel ini tidak memiliki ide baru. Jika Anda memiliki teman yang pernah mempelajarinya, abaikan saja.
Sebagai pengembang front-end, ketika memahami masalah ini, Anda perlu mengetahui apa masalahnya dan alasannya. Oleh karena itu, sebelum memperkenalkan kebocoran memori js, mari kita mulai dengan mengapa ada kebocoran memori.
Ketika berbicara tentang kebocoran memori, kita harus berbicara tentang cara memori dialokasikan. Ada tiga cara untuk mengalokasikan memori, yaitu:
1. Alokasi Statis : Bentuk alokasi variabel statis dan variabel global. Jika kita menganggap sebuah ruangan sebagai sebuah program, kita dapat menganggap memori yang dialokasikan secara statis sebagai furnitur tahan lama di dalam ruangan. Biasanya, barang-barang tersebut tidak perlu dilepaskan dan didaur ulang karena tidak ada orang yang membuang lemari ke luar jendela sebagai sampah setiap hari.
2. Alokasi Otomatis: Metode pengalokasian memori untuk variabel lokal pada stack. Memori dalam tumpukan dapat dilepaskan secara otomatis dengan operasi pop ketika blok kode keluar.
Hal ini mirip dengan orang yang datang ke suatu ruangan untuk melakukan sesuatu. Setelah pekerjaannya selesai, mereka akan pergi dengan sendirinya, dan ruang yang mereka tempati akan secara otomatis terlepas saat orang-orang tersebut pergi.
3. Alokasi Dinamis: Metode mengalokasikan ruang memori secara dinamis di heap untuk menyimpan data. Artinya, memori yang diterapkan menggunakan malloc atau new ketika program sedang berjalan, kita perlu melepaskannya sendiri menggunakan free atau delete. Masa pakai memori dinamis ditentukan oleh pemrogram. Sekali Anda lupa melepaskannya, pasti akan menyebabkan kebocoran memori. Dalam hal ini, blok memori di tumpukan itu seperti serbet yang kita gunakan sehari-hari, setelah digunakan kita harus membuangnya ke tempat sampah, jika tidak maka rumah akan berantakan. Oleh karena itu, orang malas bermimpi memiliki robot rumah tangga untuk dibersihkan. Dalam pengembangan perangkat lunak, jika Anda terlalu malas untuk mengosongkan memori, maka Anda juga memerlukan robot serupa - yang sebenarnya adalah pengumpul sampah yang diimplementasikan dengan algoritma tertentu. Justru beberapa cacat pada mekanisme pengumpulan sampah itu sendiri yang menyebabkan kebocoran memori JavaScript.
Beberapa tahun lalu, saya membaca artikel berjudul "Sejarah Menarik Daur Ulang Sampah" yang memberikan penjelasan mendalam tentang mekanisme pengumpulan sampah.
Sama seperti supercharging, teknologi yang banyak digunakan oleh mobil-mobil mewah sebagai nilai jualnya, yang sebenarnya pernah digunakan oleh Mercedes-Benz pada tahun 1910-an, teknologi daur ulang sampah sudah ada sejak lama. Bahasa Lisp, lahir di MIT sekitar tahun 1960, merupakan bahasa pertama yang sangat mengandalkan teknologi alokasi memori dinamis. Hampir semua data di Lisp muncul dalam bentuk "tabel", dan ruang yang ditempati oleh "tabel" ada di heap. dialokasikan secara dinamis. Fitur manajemen memori dinamis bawaan dari bahasa Lisp mengharuskan perancang bahasa Lisp untuk memecahkan masalah pelepasan otomatis setiap blok memori di heap (jika tidak, pemrogram Lisp pasti akan kewalahan oleh pernyataan bebas atau hapus yang tak terhitung jumlahnya dalam program) Hal ini secara langsung mendorong lahirnya dan berkembangnya teknologi pengumpulan sampah.
Tiga algoritma pengumpulan sampah paling dasar juga muncul bersamaan pada saat itu. Mari kita lihat satu per satu:
Algoritma Penghitungan Referensi: Ini mungkin metode pertama yang terlintas dalam pikiran. Secara kiasan, penghitungan referensi dapat dipahami dengan cara ini. Ada banyak kertas putih di rumah, dan kertas-kertas ini seperti kenangan. Menggunakan ingatan itu seperti menulis di selembar kertas ini. Memori tersebut dapat digunakan sesuka hati, namun ada syaratnya: Siapapun yang menggunakan selembar kertas harus menulis hitungan 1 di pojok kertas. Jika dua orang menggunakan selembar kertas secara bersamaan, maka hitungannya menjadi 2, dan seterusnya. Ketika seseorang selesai menggunakan selembar kertas, hitungan di pojok harus dikurangi 1. Dengan cara ini, setelah hitungan menjadi 0, syarat pengumpulan sampah terpenuhi, dan robot yang menunggu di samping akan segera membuang kertas tersebut ke dalam. kotak sampah. Pengumpul sampah berbasis penghitung referensi berjalan lebih cepat, tidak mengganggu eksekusi program dalam waktu lama, dan cocok untuk program yang harus dijalankan secara real time. Namun, penghitung referensi meningkatkan overhead eksekusi program, dan pada saat yang sama, terdapat masalah terbesar lainnya. Algoritma ini memiliki kelemahan, yaitu, setelah referensi melingkar dihasilkan, memori akan bocor. Misalnya, kita baru dua objek a dan b. Saat ini, jumlah a dan b sama-sama 1. Lalu, kita arahkan atribut a ke b, dan atribut b ke a Referensi Hubungan, jumlah a dan b keduanya menjadi 2. Ketika program berakhir dan keluar dari ruang lingkup, program secara otomatis mengurangi jumlah a sebanyak 1. Karena jumlah a pada akhirnya masih 1, maka a tidak akan menjadi dirilis. Demikian pula, hitungan akhir b juga 1, b tidak akan dirilis, dan memori bocor saja!