Had ingatan gelung tak terhingga dan timbunan JavaScript - Ralat maut: Had timbunan tercapai Peruntukan gagal - Timbunan JavaScript daripada ingatan
P粉773659687
P粉773659687 2024-03-27 20:21:43
0
1
469

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粉773659687
P粉773659687

membalas semua(1)
P粉879517403

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);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan