


Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js
Bagaimanakah
Nod melakukan GC (pengumpulan sampah)? Artikel berikut akan membawa anda melaluinya.
GC, Kutipan Sampah, kutipan sampah. Dalam pengaturcaraan, ia biasanya merujuk kepada mekanisme kitar semula memori automatik, yang kerap mengosongkan data yang tidak diperlukan.
Node.js menggunakan enjin V8 di bawahnya. V8 ialah enjin JavaScript berprestasi tinggi sumber terbuka oleh Google, ditulis dalam C. [Cadangan tutorial berkaitan: tutorial video nodejs]
Memori Node.js terbahagi terutamanya kepada tiga bahagian:
Ruang kod: di mana segmen kod disimpan Tempat;
Tindanan: Pembolehubah sementara yang dijana oleh timbunan panggilan fungsi, yang merupakan beberapa jenis asas, seperti nombor, rentetan, nilai Boolean dan rujukan objek (alamat disimpan, objek tidak disimpan sendiri).
Heap: menyimpan data seperti objek;
Heap memory
Node.js underlying penggunaan Yang satu ialah V8 Mari kita terangkan mekanisme kitar semula memori V8.
Pertama sekali, semua objek dalam JS akan disimpan dalam ingatan timbunan. Apabila proses dibuat, saiz awal memori timbunan akan diperuntukkan, dan kemudian objek kami akan diletakkan di dalamnya.
Apabila semakin banyak objek, ingatan timbunan tidak akan mencukupi, dan ingatan timbunan akan berkembang secara dinamik. Jika had maksimum dicapai (biasanya 4GB pada masa kini), ralat limpahan timbunan berlaku dan proses Node.js ditamatkan.
Generasi Baharu dan Generasi Lama
V8 mula-mula membahagikan memori kepada dua bahagian, atau dua generasi:
-
Generasi muda : menyelamatkan beberapa objek dengan masa kelangsungan hidup yang singkat;
Generasi baharu adalah sangat kecil, dan beberapa objek dengan masa kelangsungan hidup yang singkat disimpan di sini Biasanya ia dikitar semula dengan kerap (seperti beberapa objek sementara dalam timbunan panggilan fungsi).
, dalam MB.
Selain itu, generasi lama menggunakanGenerasi baharu akan dibahagikan kepada dua ruang ini dipanggil semiruang iaitu:untuk menetapkan algoritma Scavenge generasi baharu
node --max-semi-space-size=SIZE index.js
--max-old-space-size=SIZE
Generasi baharu menggunakan algoritma Scavenge. Ia adalah berasaskan algoritma atas salinan.
Dari ruang: objek yang baru diisytiharkan akan diletakkan di sini
.
Ke ruang: ruang yang digunakan untuk penempatan semula- Objek yang baru diisytiharkan akan diletakkan dalam ruang Dari Objek dalam ruang Dari disusun rapat. Penunjuk, objek sebelumnya dekat dengan objek seterusnya, dan ingatan berterusan, jadi tidak perlu risau tentang pemecahan memori.
Apa yang dipanggil pemecahan memori merujuk kepada peruntukan ruang yang tidak sekata, mengakibatkan sejumlah besar ruang berterusan kecil yang tidak boleh dimuatkan ke dalam objek besar.
Kelebihan algoritma berasaskan salinan ini ialah ia boleh menangani masalah pemecahan memori dengan sangat baik , ia tidak sesuai untuk peruntukan yang terlalu besar Ruang memori lebih kepada GC tambahan.
Mark-Sweep dan Mark-Compact
Ruang generasi lama jauh lebih besar daripada ruang generasi baharu Ia mengandungi beberapa objek yang bertahan lama masa. Penggunaan ialah algoritma Mark-Sweep (penyingkiran tanda). Pertama ialah peringkat penandaan. Cari semua objek yang boleh diakses daripada Set Root (timbunan pelaksanaan dan objek global) dan tandakannya sebagai objek aktif.Selepas menanda, ia adalah fasa mengosongkan objek yang tidak ditanda sebenarnya menandakan alamat memori sebagai percuma.
Pendekatan ini akan membawa kepadapemecahan ruang memori percuma
Apabila kita mencipta objek berterusan yang besar, kita tidak akan dapat mencari tempat untuk meletakkannya. Pada masa ini, Mark-Compact (pemadatan tanda) mesti digunakan untuk menyepadukan objek aktif yang berpecah-belah. Mark-Compact akan mengalihkan semua salinan objek aktif ke satu hujung, dan kemudian sebelah lagi sempadan akan menjadi satu blok keseluruhan memori yang tersedia bersebelahan. Memandangkan Mark-Sweep dan Mark-Compact mengambil masa yang lama dan menyekat urutan JavaScript, kami biasanya tidak melakukannya sekaligus, tetapi menggunakan penandaan tambahan (Pemarkahan Bertambah) . Ini bermakna menandakan secara berselang-seli, mengambil langkah kecil dan berselang-seli pengumpulan sampah dan logik aplikasi.Selain itu, V8 juga melakukan penandaan selari dan pembersihan selari untuk meningkatkan kecekapan pelaksanaan.
Lihat maklumat berkaitan memori
Kita boleh mendapatkan beberapa maklumat berkaitan memori melalui kaedah proses.memoryUsage.
process.memoryUsage();
Kandungan output ialah:
{ rss: 35454976, heapTotal: 7127040, heapUsed: 5287088, external: 958852, arrayBuffers: 11314 }
Penjelasan
rss: saiz set pemastautin (saiz set pemastautin), termasuk coretan kod , ingatan timbunan, tindanan dan bahagian lain.
Jumlah timbunan: jumlah saiz memori timbunan V8; >luaran: Saiz memori selain daripada V8 merujuk kepada memori yang diduduki oleh objek C, seperti data Penampan.
-
arrayBuffers:
dan saiz memori yang berkaitan, sebahagian daripada luaran. - Unit nombor di atas ialah bait.
ArrayBuffer
Uji had memori maksimumSharedArrayBuffer
Tulis skrip yang menggunakan pemasa untuk menjadikan tatasusunan membesar secara berterusan dan cetak penggunaan memori timbunan sehingga memori melimpah.
Perhatian khusus harus diberikan kepada tidak menggunakan Penampan untuk ujian. Oleh kerana Buffer ialah objek pemprosesan binari yang unik untuk Node.js Ia tidak dilaksanakan secara berasingan oleh Node.js dalam C. Ia tidak memperuntukkan memori melalui V8 dan tergolong dalam timbunan luar. ingatan.
Komputer yang saya gunakan ialah macbook pro M1 Pro, versi Node.js ialahconst format = function (bytes) { return (bytes / 1024 / 1024).toFixed(2) + " MB"; }; const printMemoryUsage = function () { const memoryUsage = process.memoryUsage(); console.log( `heapTotal: ${format(memoryUsage.heapTotal)}, heapUsed: ${format( memoryUsage.heapUsed )}` ); }; const bigArray = []; setInterval(function () { bigArray.push(new Array(20 * 1024 * 1024)); printMemoryUsage(); }, 500);dan versi V8 yang digunakan ialah 9.4.146.26-node.22 (diperolehi melalui process.versions.v8 ).
Hasil keluaran ialah (beberapa maklumat berlebihan ditinggalkan):
Seperti yang anda lihat, had memori melebihi selepas 4000 MB, limpahan timbunan berlaku dan kemudian proses keluar. Ambil perhatian bahawa pada mesin saya, memori maksimum lalai ialah 4G.
Memori maksimum sebenar adalah berkaitan dengan mesin yang sedang dijalankan. Jika saiz memori mesin anda ialah 2G, memori maksimum akan ditetapkan kepada 1.5G. v16.17.0
tutorial nodejs
!heapTotal: 164.81 MB, heapUsed: 163.93 MB heapTotal: 325.83 MB, heapUsed: 323.79 MB heapTotal: 488.59 MB, heapUsed: 483.84 MB ... heapTotal: 4036.44 MB, heapUsed: 4003.37 MB heapTotal: 4196.45 MB, heapUsed: 4163.29 MB <--- Last few GCs ---> [28033:0x140008000] 17968 ms: Mark-sweep 4003.2 (4036.4) -> 4003.1 (4036.4) MB, 2233.8 / 0.0 ms (average mu = 0.565, current mu = 0.310) allocation failure scavenge might not succeed [28033:0x140008000] 19815 ms: Mark-sweep 4163.3 (4196.5) -> 4163.1 (4196.5) MB, 1780.3 / 0.0 ms (average mu = 0.413, current mu = 0.036) allocation failure scavenge might not succeed <--- JS stacktrace ---> FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory ...
Atas ialah kandungan terperinci Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.


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

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Dreamweaver CS6
Alat pembangunan web visual