Saya baru mula mengkaji pengumpulan sampah baru-baru ini Apabila saya cuba menjawab soalan yang berkaitan dengan keluaran memori nod di bahagian depan Ele.me, saya menemui beberapa soalan:
.let arr = [];
while(true)
arr.push(1);
Tatasusunan yang semakin meningkat tidak terhingga pasti akan memecahkan ingatan.
let arr = [];
while(true)
arr.push();
Saya rasa ini hanya digunakan sepanjang masa arr
,导致 arr
dan ia tidak boleh dikeluarkan, bukan?
let arr = [];
while(true)
arr.push(new Buffer(1000));
Ini kerana saiz Buffer
kurang daripada 8k Ia akan menyemak dahulu sama ada kolam memori penuh, jadi ia tidak boleh meletupkan memori?
var theThing = null
var replaceThing = function () {
var originalThing = theThing
var unused = function () {
if (originalThing)
console.log("hi")
}
theThing = {
longStr: new Array(1000000).join('*'),
someMethod: function () {
console.log(someMessage)
}
};
};
setInterval(replaceThing, 1000)
Ini kerana penutupan unused
对 originalThing
进行了引用,所以每一个 unused
都形成了一个 originalThing
的作用域 replaceThing
ini tidak akan dikitar semula, jadi ia akan sentiasa terkumpul dalam ingatan?
Sebab saya tak berapa pasti, jadi saya ingin sesiapa yang lebih tahu menjawab, terima kasih!
Penimbal baharu mungkin bukan masalah letupan memori yang mudah. Penampan diperuntukkan di luar timbunan V8, jadi ia sebenarnya lebih serius daripada masalah pertama yang saya ranap.
Perkara kedua yang harus dikatakan ialah kerana saiz tatasusunan tidak akan berkembang, ia tidak akan memecahkan memori.
Sebabnya disebut dalam artikel asal yang ketiga
Jika anda masih tidak faham, anda boleh membaca artikel penemu asal, yang menerangkannya secara terperinci.
Kod gelung tak terhingga akan memecahkan memori ke mana sahaja ia pergi, terutamanya bahasa berbenang tunggalseperti js, yang akan terus menyekat dan membeku.
Saya tidak pernah menggunakan jenis Penampan Saya tidak pasti sama ada ia akan menyemak kumpulan memori, tetapi ia tidak masuk akal jika ia tersekat atau tidak.
Saya bersetuju dengan penyataan terakhir anda Setiap kitaran mencipta objek baharu, dan alamat rujukan theThing sentiasa berubah Dalam keadaan biasa, objek rujukan lama harus dikumpul sampah, tetapi kerana rujukan yang tidak digunakan kepada objek originalThing, originalThing Another private. berubah-ubah, jadi objek lama tidak boleh dikumpul sampah, menyebabkan kebocoran memori.
Adakah terdapat sebarang perbezaan antara kod berikut ini berjalan dalam persekitaran krom selama 30 saat.
Gambar pertama ialah hasil tanpa kod ini, dan memori terapung pada 15M.
Gambar kedua adalah hasil kod ini, ingatan terus berkembang.
Saya tidak pasti, tetapi anda boleh menggunakan pakej memwatch-next untuk melihatnya