2015-04-09 14 views
5
memoria

JVM è suddivisa in: 1. Metodo Area 2. Mucchio Area 3. Pila 4. PC Registrati 5. Native PilaDove serie di primitive memorizzati nella memoria JVM

  1. Ora supponiamo Ho una classe con proprietà di dire "int [] dealCodes" (array di primitive int). Come per la gestione della memoria una volta inizializzato il codice deal, ci sarebbe un'allocazione di memoria contigua di (total_elements * 4 byte) in memoria. Quindi se la dimensione dell'array è 10, allora ci sarà un'allocazione di 40 byte nella memoria JVM.

    La mia domanda è in quale area verranno allocati questi 40 byte (heap o stack)?

    La mia comprensione dell'array è: è come qualsiasi altro oggetto e risiede nell'area dell'heap ma non conosco le primitive a cui l'array punta.

  2. Inoltre, desidera conoscere lo scenario simile quando l'array contiene riferimenti (ad esempio array di tipo Employees). Penso che in questo caso, tutto sarà in area heap. Poiché questi sono riferimenti, la matrice manterrà 4 byte per ogni riferimento (sistema a 32 bit) e questi riferimenti punteranno a oggetti di dimensioni variabili. L'allocazione della memoria di array verrà calcolata sulla base della dimensione di riferimento e non della dimensione dell'oggetto.

Please help me per ottenere chiarezza sopra 2 punti.

+0

Gli array sono oggetti quindi è sul mucchio –

risposta

2

Gli oggetti sono sempre allocati in modo che il dealCodes sia assegnato solo lì ma la memoria totale allocata è superiore a 40 byte.

12 bytes (Header) + 4 bytes (Length of Array) + 40 bytes (4 bytes * 10 ints) = 56 bytes 

Stessa cosa vale per una matrice di Employee oggetti così tranne che ogni elemento dell'array è ora un riferimento all'oggetto Dipendente, quindi la Shallow Heap occupata dai dipendenti matrice è ancora 56 byte mentre la Retained Heap dipende dalle dimensioni di ogni oggetto Dipendente.

È possibile utilizzare VisualVM nella directory JDK_HOME/bin per scattare un'istantanea del programma/dell'applicazione, vedere la memoria occupata da ciascun oggetto, sia le dimensioni dell'heap superficiale che quelle conservate.

+0

Arkantos & Clément ... grazie a entrambi per chiarire il mio dubbio ... spiegazione cristallina .... :-) –

2
  1. mia domanda è in quale zona questo 40 byte verranno assegnati (mucchio o stack)?

Heap allocato.

Si noti che verranno allocati più di 40 byte poiché è presente un sovraccarico per l'intestazione dell'oggetto + l'attributo di lunghezza dell'array.

Se siete interessati a questo, si può giocare con Java Object Layout

vogliono anche sapere di scenario simile quando array contiene riferimenti (per esempio serie di dipendenti Tipologia). Penso che in questo caso, tutto sarà in area heap. Poiché questi sono riferimenti, la matrice manterrà 4 byte per ogni riferimento (sistema a 32 bit) e questi riferimenti punteranno a oggetti di dimensioni variabili.

Esattamente.

La dimensione dei riferimenti dipende dall'architettura, 32 bit VS 64 bit e il possibile utilizzo di CompressedOops.

+0

A partire da JDK7, CompressedOops sono abilitati di default e funzionano solo per heap inferiori a 32 GB, ha fatto notare :) – Arkantos

+0

Sì, è abilitato per impostazione predefinita per la maggior parte degli utilizzi, ma l'ingombro della memoria dipende ancora dall'utilizzo di CompressedOops :) –

+0

Vero, fino a Java 6, tale flag ha effettivamente contribuito a ridurre le dimensioni dell'intestazione dell'oggetto nella JVM a 64 bit, ma ora (Java 7 e 8) non ti devi preoccupare finché ci troviamo in quel limite di 32 GB su una macchina virtuale a 64 bit :) – Arkantos

Problemi correlati