Jadual Kandungan
Heap memory
Generasi Baharu dan Generasi Lama
Selepas menanda, ia adalah fasa mengosongkan objek yang tidak ditanda sebenarnya menandakan alamat memori sebagai percuma.
Lihat maklumat berkaitan memori
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.
Rumah hujung hadapan web tutorial js Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js

Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js

Nov 29, 2022 pm 08:44 PM
hujung hadapan node.js

Bagaimanakah

Nod melakukan GC (pengumpulan sampah)? Artikel berikut akan membawa anda melaluinya.

Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js

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

Saiz generasi baharu boleh diubah suai melalui

, dalam MB.

Selain itu, generasi lama menggunakan

untuk menetapkan algoritma Scavenge generasi baharu node --max-semi-space-size=SIZE index.js

--max-old-space-size=SIZEGenerasi baharu menggunakan algoritma Scavenge. Ia adalah berasaskan algoritma atas salinan.

Generasi baharu akan dibahagikan kepada dua ruang ini dipanggil semiruang iaitu:

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.

Apabila ruang Dari hampir penuh, kami akan melintasi untuk mencari objek aktif dan menyalinnya ke ruang Kepada. Pada ketika ini, ruang Dari sebenarnya kosong, dan kemudian kami menukar identiti Dari dan Kepada.

Jika sesetengah objek disalin beberapa kali, ia akan dianggap mempunyai masa hidup yang lebih lama dan akan dipindahkan ke generasi lama.

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 kepada

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

Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js

Lihat maklumat berkaitan memori

Kita boleh mendapatkan beberapa maklumat berkaitan memori melalui kaedah proses.memoryUsage.

process.memoryUsage();
Salin selepas log masuk

Kandungan output ialah:

{
  rss: 35454976,
  heapTotal: 7127040,
  heapUsed: 5287088,
  external: 958852,
  arrayBuffers: 11314
}
Salin selepas log masuk

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.
  • ArrayBufferUji 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 ialah
const 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);
Salin selepas log masuk
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

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:

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
...
Salin selepas log masuk

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!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

PHP dan Vue: gandingan sempurna alat pembangunan bahagian hadapan PHP dan Vue: gandingan sempurna alat pembangunan bahagian hadapan Mar 16, 2024 pm 12:09 PM

PHP dan Vue: gandingan sempurna alat pembangunan bahagian hadapan Dalam era perkembangan pesat Internet hari ini, pembangunan bahagian hadapan telah menjadi semakin penting. Memandangkan pengguna mempunyai keperluan yang lebih tinggi dan lebih tinggi untuk pengalaman tapak web dan aplikasi, pembangun bahagian hadapan perlu menggunakan alat yang lebih cekap dan fleksibel untuk mencipta antara muka yang responsif dan interaktif. Sebagai dua teknologi penting dalam bidang pembangunan bahagian hadapan, PHP dan Vue.js boleh dianggap sebagai alat yang sempurna apabila digandingkan bersama. Artikel ini akan meneroka gabungan PHP dan Vue, serta contoh kod terperinci untuk membantu pembaca memahami dan menggunakan kedua-dua ini dengan lebih baik.

Bagaimana untuk menggunakan bahasa Go untuk pembangunan bahagian hadapan? Bagaimana untuk menggunakan bahasa Go untuk pembangunan bahagian hadapan? Jun 10, 2023 pm 05:00 PM

Dengan perkembangan teknologi Internet, pembangunan front-end telah menjadi semakin penting. Terutamanya populariti peranti mudah alih memerlukan teknologi pembangunan bahagian hadapan yang cekap, stabil, selamat dan mudah diselenggara. Sebagai bahasa pengaturcaraan yang berkembang pesat, bahasa Go telah digunakan oleh semakin ramai pembangun. Jadi, adakah boleh menggunakan bahasa Go untuk pembangunan bahagian hadapan? Seterusnya, artikel ini akan menerangkan secara terperinci cara menggunakan bahasa Go untuk pembangunan bahagian hadapan. Mari kita lihat dahulu mengapa bahasa Go digunakan untuk pembangunan bahagian hadapan. Ramai orang berpendapat bahawa bahasa Go ialah a

Soalan yang sering ditanya oleh penemuduga front-end Soalan yang sering ditanya oleh penemuduga front-end Mar 19, 2024 pm 02:24 PM

Dalam temu bual pembangunan bahagian hadapan, soalan lazim merangkumi pelbagai topik, termasuk asas HTML/CSS, asas JavaScript, rangka kerja dan perpustakaan, pengalaman projek, algoritma dan struktur data, pengoptimuman prestasi, permintaan merentas domain, kejuruteraan bahagian hadapan, corak reka bentuk, dan teknologi dan trend baharu. Soalan penemuduga direka bentuk untuk menilai kemahiran teknikal calon, pengalaman projek dan pemahaman tentang trend industri. Oleh itu, calon harus bersedia sepenuhnya dalam bidang ini untuk menunjukkan kebolehan dan kepakaran mereka.

Adakah Django bahagian hadapan atau belakang? semaklah! Adakah Django bahagian hadapan atau belakang? semaklah! Jan 19, 2024 am 08:37 AM

Django ialah rangka kerja aplikasi web yang ditulis dalam Python yang menekankan pembangunan pesat dan kaedah bersih. Walaupun Django ialah rangka kerja web, untuk menjawab soalan sama ada Django ialah front-end atau back-end, anda perlu mempunyai pemahaman yang mendalam tentang konsep front-end dan back-end. Bahagian hadapan merujuk kepada antara muka yang pengguna berinteraksi secara langsung, dan bahagian belakang merujuk kepada program bahagian pelayan Mereka berinteraksi dengan data melalui protokol HTTP. Apabila bahagian hadapan dan bahagian belakang dipisahkan, program bahagian hadapan dan bahagian belakang boleh dibangunkan secara bebas untuk melaksanakan logik perniagaan dan kesan interaktif masing-masing, dan pertukaran data.

Bolehkah golang digunakan sebagai front-end? Bolehkah golang digunakan sebagai front-end? Jun 06, 2023 am 09:19 AM

Golang boleh digunakan sebagai front-end Golang adalah bahasa pengaturcaraan yang sangat serba boleh yang boleh digunakan untuk membangunkan pelbagai jenis aplikasi, termasuk aplikasi front-end Dengan menggunakan Golang untuk menulis front-end, anda boleh menyingkirkan a siri masalah yang disebabkan oleh bahasa seperti JavaScript Contohnya, masalah seperti keselamatan jenis yang lemah, prestasi rendah dan sukar untuk mengekalkan kod.

Perkongsian pengalaman pembangunan C#: kemahiran pembangunan kolaboratif bahagian hadapan dan belakang Perkongsian pengalaman pembangunan C#: kemahiran pembangunan kolaboratif bahagian hadapan dan belakang Nov 23, 2023 am 10:13 AM

Sebagai pembangun C#, kerja pembangunan kami biasanya merangkumi pembangunan bahagian hadapan dan bahagian belakang Apabila teknologi berkembang dan kerumitan projek meningkat, pembangunan kolaboratif bahagian hadapan dan bahagian belakang menjadi semakin penting dan kompleks. Artikel ini akan berkongsi beberapa teknik pembangunan kolaboratif bahagian hadapan dan belakang untuk membantu pembangun C# menyelesaikan kerja pembangunan dengan lebih cekap. Selepas menentukan spesifikasi antara muka, pembangunan kolaboratif bahagian hadapan dan belakang tidak dapat dipisahkan daripada interaksi antara muka API. Untuk memastikan pembangunan kolaboratif bahagian hadapan dan belakang yang lancar, perkara yang paling penting ialah menentukan spesifikasi antara muka yang baik. Spesifikasi antara muka melibatkan nama antara muka

Meneroka teknologi bahagian hadapan bahasa Go: visi baharu untuk pembangunan bahagian hadapan Meneroka teknologi bahagian hadapan bahasa Go: visi baharu untuk pembangunan bahagian hadapan Mar 28, 2024 pm 01:06 PM

Sebagai bahasa pengaturcaraan yang pantas dan cekap, bahasa Go popular secara meluas dalam bidang pembangunan bahagian belakang. Walau bagaimanapun, beberapa orang mengaitkan bahasa Go dengan pembangunan bahagian hadapan. Malah, menggunakan bahasa Go untuk pembangunan bahagian hadapan bukan sahaja boleh meningkatkan kecekapan, tetapi juga membawa ufuk baharu kepada pembangun. Artikel ini akan meneroka kemungkinan menggunakan bahasa Go untuk pembangunan bahagian hadapan dan memberikan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik bahagian ini. Dalam pembangunan front-end tradisional, JavaScript, HTML dan CSS sering digunakan untuk membina antara muka pengguna

Cara melaksanakan pemesejan segera pada bahagian hadapan Cara melaksanakan pemesejan segera pada bahagian hadapan Oct 09, 2023 pm 02:47 PM

Kaedah untuk melaksanakan pemesejan segera termasuk WebSocket, Tinjauan Panjang, Acara Dihantar Pelayan, WebRTC, dsb. Pengenalan terperinci: 1. WebSocket, yang boleh mewujudkan sambungan berterusan antara pelanggan dan pelayan untuk mencapai komunikasi dua hala masa nyata Bahagian hadapan boleh menggunakan API WebSocket untuk membuat sambungan WebSocket dan mencapai pemesejan segera dengan menghantar dan menerima. mesej; 2. Long Polling, teknologi yang menyerupai komunikasi masa nyata, dsb.

See all articles