2016-02-23 9 views
5

Se ho deliberatamente spreco di memoria utilizzando le matrici JS in Chrome (V48), chiamando ripetutamente:In Chrome, perché TypedArrays non si trova nell'heap JS?

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); 
    } 
} 

quindi la scheda del browser si blocca a circa l'utilizzo 700MB (secondo Task Manager), che corrisponde grosso modo il limite specificato in performance.memory.jsHeapSizeLimit.

Tuttavia, se perdo la memoria utilizzando un TypedArray quali Int32Array, chiamando ripetutamente:

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); 
    } 
} 

Allora posso continuare ad andare sempre più in alto fino a quando mi ha colpito quello che presumo essere il limite di memoria processo a 32 bit di Windows circa 2,9 GB!

È semplicemente il caso che TypedArrays aggira le limitazioni dell'heap JS? Perché? C'è qualcos'altro che dovrei preoccuparmi di TypedArrays?

risposta

4

I dati memorizzati negli array digitati, poiché si tratta di tutti i numeri, sono garantiti che non contengano riferimenti ad altri oggetti, quindi non ha alcun effetto sul fatto che qualsiasi altro oggetto sia inutile. Pertanto, i dati non devono mai essere scansionati, copiati o manipolati in altro modo dal garbage collector.

Dato questo, è una strategia di implementazione molto comune collocare tali dati "bulk" "puri" al di fuori dell'heap del garbage collector, per ridurre la quantità di dati che il garbage collector deve gestire.

Non vi è alcun motivo fondamentale per indicare che dovrebbero esserci due limiti di memoria separati (o la mancanza di limiti), come è stato osservato, ma se non viene fatto alcuno sforzo per imporre un limite di memoria combinato, questo è ciò che accade.

+0

Per inciso, non ho trovato lo stesso comportamento in Firefox. Immagino, come hai suggerito, questa è semplicemente l'implementazione che Google ha seguito per Chrome. Continuo a leggere sul "limite di 1 GB per scheda in Chrome V8", ma non ero in grado di replicare questo, e non sembra corrispondere a performance.memory.jsHeapSizeLimit. –

Problemi correlati