node.js - Isu yang berkaitan dengan pengumpulan sampah nod dan kebocoran memori
某草草
某草草 2017-05-16 13:42:15
0
3
737

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 unusedoriginalThing 进行了引用,所以每一个 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!

某草草
某草草

membalas semua(3)
漂亮男人

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

Sebagai contoh, dalam kes di atas, fungsi yang tidak digunakan memegang rujukan kepada originalThing, supaya objek lama tidak akan dilepaskan setiap kali, menyebabkan kebocoran memori

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 tunggal​​seperti 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.

function unused() {
  if (originalThing) console.log("hi");
}

小葫芦

Saya tidak pasti, tetapi anda boleh menggunakan pakej memwatch-next untuk melihatnya

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan