cari

Rumah  >  Soal Jawab  >  teks badan

Had ingatan gelung tak terhingga dan timbunan JavaScript - Ralat maut: Had timbunan tercapai Peruntukan gagal - Timbunan JavaScript daripada ingatan

Saya cuba menjalankan beberapa skrip yang memerlukan gelung untuk dijalankan selama-lamanya (sehingga syarat tertentu dipenuhi, tetapi ini boleh mengambil masa selama-lamanya). Operasi di dalam gelung adalah sangat mudah, tiada pembolehubah baharu dibuat, elemen ditolak ke tatasusunan, atau panggilan baharu dibuat. Pada asasnya, sekurang-kurangnya pada pendapat saya, tiada sumber baharu digunakan setiap gelung. Walau bagaimanapun, saya akhirnya menghadapi ralat yang terkenal:

fatal error: reached heap limit allocation failed - javascript heap out of memory

Saya telah mengkaji penggunaan memori dalam gelung dan demi kesederhanaan masalah saya boleh dianggap serupa dengan ini:

async function main(){
    let n = 5;
    while(1){
        console.log("number: " + n + "; squared: " + n**2);
        console.log(process.memoryUsage());
    }    
}

Saya mendapati bahawa walaupun "tidak melakukan apa-apa", penggunaan timbunan terus berkembang dengan setiap gelung. Saya mencuba perkara yang sama mengubah gelung menjadi fungsi rekursif dan mendapat hasil yang serupa. Saya juga biasa dengan menukar peruntukan saiz memori timbunan, tetapi itu bukan penyelesaian untuk keadaan ini kerana saya memerlukannya untuk berjalan selama-lamanya.

Apakah formula pengekodan yang perlu saya gunakan untuk menjalankan gelung seperti ini? Apakah yang perlu saya ubah untuk mencapai ini tanpa meningkatkan timbunan? Saya tahu sesuatu tentang Pengumpul Sampah dan saya boleh menganggap ciri inilah yang menyebabkan pengehadan, tetapi tidak dapat memahami sebabnya. Nampaknya apa yang saya cuba lakukan adalah keperluan yang sangat mudah yang akan dihadapi oleh ramai orang, dan saya tidak percaya Java telah melumpuhkannya.

Terima kasih atas jawapan anda

P粉773659687P粉773659687243 hari yang lalu436

membalas semua(1)saya akan balas

  • P粉879517403

    P粉8795174032024-03-28 18:59:49

    Saya amat mengesyorkan menggunakan setInterval atau requestAnimationFrame. JavaScript adalah satu benang, yang boleh membawa kepada gelung tak terhingga (walaupun dalam fungsi async), yang mungkin menghalang kod lain daripada dilaksanakan.

    Saya harap ini menyelesaikan masalah anda.

    let n = 5;
    
    function someFunction() {
      console.log("number: " + n + "; squared: " + n ** 2);
      console.log(process.memoryUsage());
    }
    
    someFunction();
    setInterval(performTask, 1000);

    balas
    0
  • Batalbalas