Variabel hapus javascript dari memori
Pada artikel ini, saya akan memperkenalkan Anda tentang cara kerja alokasi memori dan pengumpulan sampah dan bagaimana Anda dapat menghindari beberapa kebocoran memori yang umum Show
Bagaimana cara kerja JavaScript di browser?Artikel ini adalah bagian kedua dari seri posting saya, di mana saya menjelaskan cara kerja JavaScript di browser. Untuk mendapatkan artikel terbaru saya ke kotak masuk Anda, berlangganan buletin saya
Siklus hidup memoriDalam JavaScript, saat kita membuat variabel, fungsi, atau apa pun yang dapat Anda pikirkan, mesin JS mengalokasikan memori untuk ini dan melepaskannya setelah tidak diperlukan lagi Mengalokasikan memori adalah proses memesan ruang dalam memori, sementara melepaskan memori membebaskan ruang, siap digunakan untuk tujuan lain Setiap kali kita menetapkan variabel atau membuat fungsi, memori untuk itu selalu melewati tahapan yang sama
"Objek" dalam konteks manajemen memori tidak hanya mencakup objek JS tetapi juga fungsi dan cakupan fungsi Tumpukan dan tumpukan memoriKami sekarang tahu bahwa untuk semua yang kami definisikan dalam JavaScript, mesin mengalokasikan memori dan membebaskannya setelah kami tidak membutuhkannya lagi Pertanyaan berikutnya yang muncul di benak saya adalah. Di mana ini akan disimpan? Mesin JavaScript memiliki dua tempat untuk menyimpan data. Tumpukan dan tumpukan memori Tumpukan dan tumpukan adalah dua struktur data yang digunakan mesin untuk tujuan berbeda Tumpukan. Alokasi memori statisAnda mungkin tahu tumpukan dari bagian pertama seri ini pada tumpukan panggilan dan loop peristiwa, di mana saya berfokus pada bagaimana itu digunakan untuk melacak fungsi yang perlu dipanggil oleh juru bahasa JS Semua nilai disimpan dalam tumpukan karena semuanya berisi nilai primitif Tumpukan adalah struktur data yang digunakan JavaScript untuk menyimpan data statis. Data statis adalah data di mana mesin mengetahui ukurannya pada waktu kompilasi. Dalam JavaScript, ini termasuk nilai-nilai primitif (string, angka, boolean, undefined, dan null) dan referensi, yang menunjuk ke objek dan fungsi Karena mesin mengetahui bahwa ukurannya tidak akan berubah, mesin akan mengalokasikan jumlah memori yang tetap untuk setiap nilai Proses pengalokasian memori tepat sebelum eksekusi dikenal sebagai alokasi memori statis Karena mesin mengalokasikan jumlah memori yang tetap untuk nilai-nilai ini, ada batasan seberapa besar nilai-nilai primitif Batas nilai ini dan seluruh tumpukan bervariasi tergantung pada browser Tumpukan. Alokasi memori dinamisTumpukan adalah ruang berbeda untuk menyimpan data tempat JavaScript menyimpan objek dan fungsi Berbeda dengan tumpukan, mesin tidak mengalokasikan jumlah memori tetap untuk objek ini. Sebaliknya, lebih banyak ruang akan dialokasikan sesuai kebutuhan Mengalokasikan memori dengan cara ini juga disebut alokasi memori dinamis Untuk mendapatkan gambaran umum, berikut adalah fitur dari kedua penyimpanan yang dibandingkan secara berdampingan StackHeapNilai dan referensi primitifObjek dan fungsiUkuran diketahui pada waktu kompilasiUkuran diketahui pada waktu prosesMengalokasikan jumlah memori tetapTidak ada batasan per objekContohMari kita lihat beberapa contoh kode. Dalam keterangan saya menyebutkan apa yang dialokasikan
Array adalah objek juga, itulah sebabnya mereka disimpan di heap
Nilai primitif tidak dapat diubah, yang berarti alih-alih mengubah nilai asli, JavaScript membuat yang baru Referensi dalam JavaScriptSemua variabel pertama menunjuk ke tumpukan. Jika itu adalah nilai non-primitif, tumpukan berisi referensi ke objek di tumpukan Memori heap tidak diurutkan dengan cara tertentu, oleh karena itu kita perlu menyimpan referensi ke dalam stack. Anda dapat menganggap referensi sebagai alamat dan objek di heap sebagai rumah tempat alamat tersebut berada Ingatlah bahwa JavaScript menyimpan objek dan fungsi di helai. Nilai dan referensi primitif disimpan dalam tumpukan Dalam gambar ini, kita dapat mengamati bagaimana berbagai nilai disimpan. Perhatikan bagaimana _2 dan 3 keduanya menunjuk ke objek yang samaContoh
Ini membuat objek baru di tumpukan dan referensi ke dalam tumpukan Referensi adalah konsep inti tentang cara kerja JavaScript. Membahas lebih detail di sini akan berada di luar cakupan artikel ini, tetapi jika Anda ingin mempelajarinya lebih lanjut, beri tahu saya di komentar dan berlangganan buletin saya Pengumpulan sampahKami sekarang tahu bagaimana JavaScript mengalokasikan memori untuk semua jenis objek, tetapi jika kami mengingat siklus hidup memori, ada satu langkah terakhir yang hilang. melepaskan ingatan Sama seperti alokasi memori, mesin JavaScript juga menangani langkah ini untuk kita. Lebih khusus lagi, pengumpul sampah menangani ini Setelah mesin JavaScript mengenali bahwa variabel atau fungsi yang diberikan tidak diperlukan lagi, ia melepaskan memori yang ditempati Masalah utama dengan ini adalah apakah beberapa memori masih diperlukan atau tidak adalah masalah yang tidak dapat diputuskan, yang berarti tidak mungkin ada algoritme yang dapat mengumpulkan semua memori yang tidak diperlukan lagi pada saat yang tepat menjadi usang. Beberapa algoritma menawarkan pendekatan yang baik untuk masalah tersebut. Saya akan membahas yang paling banyak digunakan di bagian ini. Pengumpulan sampah penghitungan referensi dan algoritme mark and sweep Pengumpulan sampah yang menghitung referensiYang ini adalah perkiraan termudah. Itu mengumpulkan objek yang tidak memiliki referensi yang menunjuk ke sana Mari kita lihat contoh berikut. Garis mewakili referensi Perhatikan bagaimana di frame terakhir hanya _4 yang tetap berada di heap karena itu adalah objek yang memiliki referensi pada akhirnyaSiklusMasalah dengan algoritme ini adalah tidak mempertimbangkan referensi siklik. Ini terjadi ketika satu atau lebih objek saling mereferensikan, tetapi mereka tidak dapat diakses melalui kode lagi
Karena objek 5 dan 6 saling merujuk satu sama lain, algoritme tidak akan melepaskan memori yang dialokasikan. Tidak ada cara bagi kami untuk mengakses kedua objek itu lagiMenyetelnya ke _7 tidak akan membuat algoritme penghitungan referensi menyadari bahwa keduanya tidak dapat digunakan lagi karena keduanya memiliki referensi yang masukAlgoritma Mark-and-sweepAlgoritme mark-and-sweep memiliki solusi untuk dependensi siklik. Alih-alih hanya menghitung referensi ke objek tertentu, ia mendeteksi jika dapat dijangkau dari objek root Akar di browser adalah objek _8, sedangkan di NodeJS ini adalah 9Algoritme menandai objek yang tidak dapat dijangkau sebagai sampah, dan menyapu (mengumpulkan) setelahnya. Objek root tidak akan pernah dikumpulkan Dengan cara ini, dependensi siklik tidak menjadi masalah lagi. Dalam contoh sebelumnya, baik objek _6 maupun 5 tidak dapat dijangkau dari root. Dengan demikian, keduanya akan ditandai sebagai sampah dan dikumpulkanSejak 2012, algoritme ini diterapkan di semua browser modern. Perbaikan hanya dilakukan pada kinerja dan implementasi, tetapi tidak pada ide inti algoritme itu sendiri Trade-offPengumpulan sampah otomatis memungkinkan kita untuk fokus membangun aplikasi daripada kehilangan waktu dengan manajemen memori. Namun, ada beberapa pengorbanan yang perlu kita waspadai penggunaan memoriMengingat algoritme tidak dapat mengetahui kapan tepatnya memori tidak diperlukan lagi, aplikasi JavaScript dapat menggunakan lebih banyak memori daripada yang sebenarnya dibutuhkan Meskipun objek ditandai sebagai sampah, terserah pengumpul sampah untuk memutuskan kapan dan apakah memori yang dialokasikan akan dikumpulkan Jika Anda membutuhkan aplikasi Anda seefisien mungkin memori, Anda lebih baik menggunakan bahasa tingkat rendah. Namun perlu diingat bahwa ini datang dengan serangkaian pengorbanannya sendiri PertunjukanAlgoritme yang mengumpulkan sampah untuk kita biasanya berjalan secara berkala untuk membersihkan objek yang tidak terpakai Masalahnya adalah kami, para pengembang, tidak tahu kapan tepatnya ini akan terjadi. Mengumpulkan banyak sampah atau sering mengumpulkan sampah dapat memengaruhi kinerja karena memerlukan sejumlah daya komputasi untuk melakukannya Namun, dampaknya biasanya tidak terlihat oleh pengguna atau pengembang Memori bocorBerbekal semua pengetahuan tentang manajemen memori ini, mari kita lihat kebocoran memori yang paling umum Anda akan melihat bahwa ini dapat dengan mudah dihindari jika seseorang memahami apa yang terjadi di balik layar Variabel globalMenyimpan data dalam variabel global mungkin merupakan jenis kebocoran memori yang paling umum Dalam JavaScript untuk browser, jika Anda mengabaikan 2, 3, atau 4, variabel akan dilampirkan ke objek 8
Hindari ini dengan menjalankan kode Anda dalam mode ketat Selain menambahkan variabel secara tidak sengaja ke root, ada banyak kasus di mana Anda mungkin melakukannya dengan sengaja Anda pasti dapat menggunakan variabel global, tetapi pastikan Anda mengosongkan ruang setelah Anda tidak memerlukan data lagi Untuk melepaskan memori, tetapkan variabel global ke 7
Saya ingin membuat artikel ini semudah mungkin untuk dipahami. Jika Anda memiliki pertanyaan terbuka, kirimkan saya email atau tinggalkan komentar. Saya akan mencoba membantu Anda dan meningkatkan artikel dengan umpan balik Anda Penghitung waktu dan panggilan balik yang terlupakanMelupakan pengatur waktu dan panggilan balik dapat membuat penggunaan memori aplikasi Anda meningkat. Khususnya di Single Page Applications (SPA), Anda harus berhati-hati saat menambahkan event listener dan callback secara dinamis Timer yang terlupakan
Kode di atas menjalankan fungsi setiap 2 detik. Jika Anda memiliki kode seperti ini di proyek Anda, Anda mungkin tidak memerlukan ini untuk dijalankan sepanjang waktu Objek yang direferensikan dalam interval tidak akan menjadi sampah yang dikumpulkan selama interval tidak dibatalkan Pastikan untuk menghapus interval setelah tidak diperlukan lagi
Ini sangat penting dalam SPA. Bahkan saat keluar dari halaman yang memerlukan interval ini, interval ini akan tetap berjalan di latar belakang Panggilan balik yang terlupakanKatakanlah Anda menambahkan pendengar _7 ke sebuah tombol, yang nantinya akan dihapusBrowser lama tidak dapat mengumpulkan pendengar, tetapi saat ini, ini bukan masalah lagi Tetap saja, sebaiknya hapus pendengar acara setelah Anda tidak membutuhkannya lagi
Referensi DOM habisKebocoran memori ini mirip dengan yang sebelumnya. Itu terjadi saat menyimpan elemen DOM dalam JavaScript _0Saat Anda menghapus salah satu elemen tersebut, Anda mungkin ingin memastikan untuk menghapus elemen ini dari array juga Jika tidak, elemen DOM ini tidak dapat dikumpulkan _1Menghapus elemen dari array membuatnya tetap sinkron dengan DOM Karena setiap elemen DOM juga menyimpan referensi ke node induknya, Anda akan mencegah pengumpul sampah mengumpulkan induk dan turunan elemen tersebut KesimpulanPada artikel ini, saya merangkum konsep inti manajemen memori dalam JavaScript Menulis artikel ini membantu saya menjernihkan beberapa konsep yang tidak saya pahami sepenuhnya, dan saya harap ini akan berfungsi sebagai ikhtisar yang baik tentang cara kerja manajemen memori dalam JavaScript Putar Ulang Sesi Sumber TerbukaOpenReplay adalah rangkaian pemutaran ulang sesi sumber terbuka yang memungkinkan Anda melihat apa yang dilakukan pengguna di aplikasi web Anda, membantu Anda memecahkan masalah dengan lebih cepat. OpenReplay dihosting sendiri untuk kontrol penuh atas data Anda Mulai nikmati pengalaman debug Anda - mulai gunakan OpenReplay secara gratis Saya telah mempelajari ini dari beberapa artikel bagus lainnya yang ingin saya sebutkan di sini juga
Sumber yang bagus untuk membaca tentang topik ini lagi
Artikel ini membahas lebih detail tentang cara kerja mesin V8. Saya menemukan ini sangat menarik Artikel lain yang mungkin menarik bagi Anda
Pada bagian pertama dari seri blog ini, saya menjelaskan mengapa Anda dapat melakukan banyak hal secara bersamaan di browser, meskipun JavaScript adalah bahasa single-threaded.
Membaca adalah cara yang bagus untuk meningkatkan keterampilan pemrograman Anda. Pada artikel ini, saya membagikan intisari dari buku pemrograman favorit saya
Artikel ini terkait erat dengan artikel ini karena menjelaskan apa yang dapat Anda lakukan tentang Node.js Anda. aplikasi js kehabisan memori Bagaimana cara menghapus variabel dari JavaScript memori?Untuk menghapus variabel dalam JavaScript, gunakan undefined. Setelah itu, gunakan operator hapus untuk menghapusnya sepenuhnya .
Bisakah Anda menghapus variabel dalam JavaScript?Variabel normal di JavaScript tidak dapat dihapus menggunakan operator hapus . Dalam mode ketat, upaya untuk menghapus variabel akan menimbulkan kesalahan dan tidak diizinkan. Operator hapus hanya dapat menghapus properti pada objek. Properti objek "memenuhi syarat" jika dapat dikonfigurasi.
Apakah variabel JavaScript disimpan dalam memori?“ Variabel dalam JavaScript (dan sebagian besar bahasa pemrograman lainnya) disimpan di dua tempat. tumpukan dan tumpukan . Tumpukan biasanya merupakan wilayah berkelanjutan dari memori yang mengalokasikan konteks lokal untuk setiap fungsi yang dijalankan. Heap adalah wilayah yang jauh lebih besar yang menyimpan semua yang dialokasikan secara dinamis.
Bagaimana Anda menghapus nilai variabel?Menggunakan perintah 'del' adalah metode yang paling dikenal dan termudah untuk menghapus variabel di Python. Kata kunci del menghapus objek. Karena semua yang ada di Python adalah objek, maka daftar, tupel, dan kamus juga dapat dihapus menggunakan 'del'. Ini memiliki sintaks yang sangat sederhana. |