Domanda

Cosa succede nella memoria quando una classe crea un'istanza del seguente oggetto?

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 classe SomeClass1 :

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

Nella classe SomeClass2 :

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

Come viene allocata la memoria per l'oggetto appena istanziato e le sue proprietà?

È stato utile?

Soluzione

Facciamo un passo avanti:

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 precisi, questi non sono realmente equivalenti. Nell'originale la 'nuova stringa' viene creata in fase di compilazione e fa parte dell'immagine .class. Puoi considerarla come un hack di prestazioni.)

Quindi, prima la JVM alloca spazio per la stringa. Di solito non conosci o ti preoccupi degli interni dell'implementazione di String, quindi fidati che un pezzo di memoria sia usato per rappresentare "qualche valore di proprietà". Inoltre, è stata allocata temporaneamente della memoria contenente un riferimento alla stringa. Nel secondo modulo, viene esplicitamente chiamato tmp ; nella tua forma originale, Java lo gestisce senza nominarlo.

Successivamente la JVM alloca spazio per un nuovo SomeObject. Questo è un po 'di spazio per la contabilità interna di Java e spazio per ciascuno dei campi dell'oggetto. In questo caso, c'è solo un campo, strSomeProperty .

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

Successivamente, viene eseguito il costruttore.

this.strSomeProperty = strSomeProperty;

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

Infine, lo spazio viene allocato per il riferimento oggetto so1 . Questo è impostato con un riferimento a SomeObject.

so2 funziona esattamente allo stesso modo.

Altri suggerimenti

Determinazione dell'utilizzo della memoria in Java del Dr. Heinz M. Kabutz fornisce una risposta precisa , oltre a un programma per calcolare l'utilizzo della memoria. La parte pertinente:

  
      
  1. La classe occupa almeno 8 byte. Quindi, se dici new Object (); assegnerai 8 byte sull'heap.
  2.   
  3. Ciascun membro di dati occupa 4 byte, ad eccezione di long e double che occupano 8 byte. Anche se il membro dati è un byte, occuperà comunque 4 byte! Inoltre, la quantità di memoria utilizzata viene aumentata in blocchi di 8 byte. Quindi, se hai una classe che contiene un byte, ci vorranno 8 byte per la classe e 8 byte per i dati, per un totale di 16 byte (gemiti!).
  4.   
  5. Le matrici sono un po 'più intelligenti. I primitivi vengono impacchettati in array, quindi se si dispone di una matrice di byte occuperanno ciascuno un byte (wow!). L'utilizzo della memoria ovviamente aumenta ancora in blocchi di 8 byte.
  6.   

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

Punti da ricordare:

  1. Quando viene chiamato un metodo, viene creato un frame nella parte superiore dello stack.
  2. Una volta completata l'esecuzione di un metodo, il flusso di controllo ritorna al metodo chiamante e il relativo frame dello stack viene scaricato.
  3. Le variabili locali vengono create nello stack.
  4. Le variabili di istanza vengono create nell'heap & amp; fanno parte dell'oggetto a cui appartengono.
  5. Le variabili di riferimento vengono create nello stack.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top