Passi nel processo di allocazione della memoria per oggetti Java

Cosa succede nella memoria quando una class istanzia il seguente object?

public class SomeObject{ private String strSomeProperty; public SomeObject(String strSomeProperty){ this.strSomeProperty = strSomeProperty; } public void setSomeProperty(String strSomeProperty){ this.strSomeProperty = strSomeProperty; } public String getSomeProperty(){ return this.strSomeProperty; } } 

Nella class SomeClass1 :

 SomeObject so1 = new SomeObject("some property value"); 

In class SomeClass2 :

 SomeObject so2 = new SomeObject("another property value"); 

In che modo la memoria è allocata all’object appena istanziato e alle sue proprietà?

Passiamo attraverso:

 SomeObject so1 = new SomeObject("some property value"); 

… è in realtà più complicato di quanto sembri, perché stai creando una nuova stringa. Potrebbe essere più facile pensare a:

 String tmp = new String("some property value"); SomeObject so1 = new SomeObject(tmp); // Not that you would normally write it in this way. 

(Per essere assolutamente accurati, questi non sono realmente equivalenti: nell’originale la “nuova stringa” viene creata in fase di compilazione e fa parte dell’immagine .class. Puoi pensare a questo come un attacco alle prestazioni.)

Quindi, prima la JVM alloca lo spazio per la stringa. In genere non si conosce o non si preoccupa delle parti interne dell’implementazione String, quindi basta considerare attendibile che un frammento di memoria sia utilizzato per rappresentare “qualche valore di proprietà”. Inoltre, si dispone di memoria temporaneamente allocata contenente un riferimento alla stringa. Nel secondo modulo, è esplicitamente chiamato tmp ; nella tua forma originale, Java lo gestisce senza nominarlo.

Quindi la JVM alloca lo spazio per un nuovo object SomeObject. Questo è un po ‘di spazio per la contabilità interna di Java e lo spazio per ciascuno dei campi dell’object. In questo caso, c’è solo un campo, strSomeProperty .

strSomeProperty che strSomeProperty è solo un riferimento a una stringa. Per ora, verrà inizializzato su null.

Successivamente, il costruttore viene eseguito.

 this.strSomeProperty = strSomeProperty; 

Tutto ciò che fa è copiare il riferimento alla stringa, nel campo strSomeProperty .

Infine, lo spazio è allocato per il riferimento all’object so1 . Questo è impostato con un riferimento a SomeObject.

so2 funziona esattamente allo stesso modo.

Determinazione dell’uso della memoria in Java dal Dr. Heinz M. Kabutz fornisce una risposta precisa, oltre a un programma per calcolare l’utilizzo della memoria. La parte rilevante:

  1. La class occupa almeno 8 byte. Quindi, se dici nuovo Object (); allocherete 8 byte sull’heap.
  2. Ogni membro dati occupa 4 byte, ad eccezione di long e double che occupano 8 byte. Anche se il membro dati è un byte, occuperà ancora 4 byte! Inoltre, la quantità di memoria utilizzata viene aumentata in blocchi da 8 byte. Quindi, se hai una class che contiene un byte, occuperà 8 byte per la class e 8 byte per i dati, per un totale di 16 byte (gemito!).
  3. Gli array sono un po ‘più intelligenti. I primitivi vengono impacchettati negli array, quindi se si dispone di una matrice di byte, ognuno di essi occupa un byte (wow!). Ovviamente l’utilizzo della memoria sale ancora in blocchi da 8 byte.

Come hanno sottolineato le persone nei commenti, le stringhe sono un caso speciale, perché possono essere internati. Puoi ragionare sullo spazio che occupano nello stesso modo, ma tieni presente che ciò che assomiglia a più copie della stessa stringa potrebbe effettivamente puntare allo stesso riferimento.

Punti da ricordare:

  1. Quando viene chiamato un metodo, un frame viene creato in cima allo stack.
  2. Una volta che un metodo ha completato l’esecuzione, il stream di controllo ritorna al metodo di chiamata e il frame dello stack corrispondente viene svuotato.
  3. Le variabili locali vengono create nello stack.
  4. Le variabili di istanza vengono create nell’heap e fanno parte dell’object a cui appartengono.
  5. Le variabili di riferimento vengono create nello stack.

Rif: http://www.javatutorialhub.com/java-stack-heap.html