2016-02-23 14 views
5

Ben kasten defalarca bu arayarak, Chrome (V48) JS dizileri kullanarak hafızayı harcarsak:, neden JS Heap üzerinde TypedArrays değil mi?

var rootReference; 
function wasteBunchOfMemoryWithJsArrays() 
{ 
    rootReference = rootReference || []; 
    for (var i = 0; i < 1000; i++) 
    { 
     var blah = []; 
     for (var j = 0; j < 10000; j++) 
     { 
      blah.push(j); 
     } 

     rootReference.push(blah); 
    } 
} 

Sonra kabaca belirtilen limiti maçları, (Görev Yöneticisi göre) yaklaşık 700MB kullanım de tarayıcı sekme kilitlendiğinde performance.memory.jsHeapSizeLimit. Ben, Windows 32 bit işlem bellek sınırı olması ne tahmin vurmak yukarı kadar ve devam edebilir Sonra

var typedRootReference; 
function wasteBunchOfMemoryWithInt32Arrays() 
{ 
    typedRootReference = typedRootReference || []; 
    for (var i = 0; i < 100; i++) { 
     var blah = new Int32Array(100000); 

     for (var j = 0; j < 100000; j++) { 
      blah[j] = j; 
     } 

     typedRootReference.push(blah); 
    } 
} 

: Ben defalarca bu arayarak, böyle Int32Array gibi bir TypedArray kullanarak bellek atık Ancak

2.9GB civarında!

sadece bunu TypedArrays JS yığın sınırlamalar almak dava var mı? Niye ya? TypedArrays ile ilgili kaygılanmam gereken başka bir şey var mı?

cevap

4

Tüm sayılar olduğundan, yazılan dizilerde saklanan veriler diğer nesneler için herhangi bir referans içermemesi garantilidir, bu nedenle başka bir nesnenin çöp olup olmadığı konusunda hiçbir etkisi yoktur. Bu nedenle, veri hiç taranmış kopyalanamaz veya başka çöp toplayıcı tarafından manipüle edilmesi gerekmez.

Bu, çöp toplayıcının yönetmesi gereken veri miktarını azaltmak için çöp toplayıcısının yığınının dışında bu “saf” “toplu” verileri yerleştirmek için çok yaygın bir uygulama stratejisidir. Bu, gözlemlediğiniz gibi iki ayrı bellek sınırlaması (veya sınırsızlık) olması gerektiği anlamına gelmek için temel bir neden yoktur, ancak birleşik bir bellek sınırı oluşturmak için herhangi bir çaba gösterilmezse, bu gerçekleşir.

+0

arada, Firefox'ta aynı davranışı tespit etmedi. Sana önerildiği gibi, bu sadece Google Chrome için gitti uygulamasıdır, sanırım. Ben "Chrome V8 sekmesini başına 1GB sınırı" hakkında okumaya devam ama bu çoğaltmak mümkün değildi ve bu performance.memory.jsHeapSizeLimit maç için görünmüyor. –