piccolo UP quotidiano...
piccolo UP quotidiano...
Il tuo "dinamicamente" è da intendere nel senso di allocato a runtime sullo stack. E una variabile esiste finché il suo scope (ambito di visibilità) non termina. Se la variabile è locale ad un metodo, quando il metodo termina, la variabile sparisce. Se è di tipo reference, il reference sparisce. L'oggetto a cui faceva riferimento è ancora sul heap e se non può più essere raggiungibile da alcun live thread, allora diventa eleggibile per il gc (garbage collection).Originariamente inviato da ragnonerodocet
MiaClasse myClass = new MiaClasse ();
succede questo:
la variabile reference è creata DINAMICAMENTE nello stack del programma, che terrà conto di tale variabile finchè il programma in run time avrà bisogno di essa.
Allocato dinamicamente sul heap.Originariamente inviato da ragnonerodocet
Tale variabile punta ad un oggetto di tipo MiaClasse allocato (STATICAMENTE???) nell'heap.
Ciò che c'è sul heap per un oggetto è l'insieme di tutti i campi di istanza che formano il suo "stato" più altri dati dedicati alla JVM (ad esempio per il "lock" che ogni oggetto possiede). La classe nell'esempio ha 3 campi di istanza: 2 int e 1 reference. Quanti byte sono in tutto? Beh, 1 int = 32 bit, per i reference dipende dalla piattaforma/JVM ma facciamo l'ipotesti di 32 bit. Sul heap quindi verranno allocati come minimo 12 byte per lo stato di un oggetto MiaClasse. E la JVM accederà ai campi molto probabilmente sapendo quale è l'offset del campo nel blocco di memoria allocato.Originariamente inviato da ragnonerodocet
E come fa tale oggetto a puntare a sua volta ai campi a, b, c e d?
La documentazione ufficiale comunque dice:
The Java virtual machine does not mandate any particular internal structure for objects.
Poi però c'è una nota:
In some of Sun's implementations of the Java virtual machine, a reference to a class instance is a pointer to a handle that is itself a pair of pointers: one to a table containing the methods of the object and a pointer to the Class object that represents the type of the object, and the other to the memory allocated from the heap for the object data.
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
Dunque mi viene da pensare, come conseguenza logica a quanto detto, che tutto cio' che sia dichiarato static viene salvato sull'HEAP STATICAMENTE, e cioe' che preesiste al runtime, metra tutto cio' che non e' static viene allocato DINAMICAMENTE sullo stack (variabile locale) o sull'HEAP.
Se quindi ho la classe MioOggetto, con tre campi d'istanza interi a, b e c, allora quando scrivo nel main
MioOggetto evviva_forse_ho_capito = new MioOggetto();
la variabile evviva_forse_ho_capito viene dinamicamente creata nello stack e punta a uno spazio di 32 bit x 3 = 96 bit nei quali sono salvati i VALORI attuali (magari inizializzati dal costruttore) dei tre campi suddetti...
Nel momento in cui tale variabile non serve piu' al programma, tale variabile scompare automaticamente, cioe' senza che il rpogrammatore debba dedicare neanche un secondo alla sua deallocazione.
Nel caso in cui, sempre nel main, io scriva
int i = 6;
nello stack viene creata la variabile i che punta al valore 6 allocato in uno spazio di 32 bit all'interno dell'heap.
Se sulla variabile precedente chiamo un metodo che prende 2 parametri interi, cioe'
int i = evviva_forse_ho_capito.getSum( 10, 5 )
allora nello spazio di memoria dedicato ai metodi si creano dinamicamente 3 locazioni di memoria consecutive, due di 32 bit ciascuna per i due valori interi e uno che dipende dal tipo di dato restituito.
Nel momento in cui il termine termina, nell'heap associato alla variabile i si scrive nel campo a 32 bit il risultato del metodo getSum, e si cancella automaticamente lo spazio di memoria del metodo.
Se invece di due interi venisse pero' usato come parametro un oggetto, cioe'
ClasseA a = new ClasseA ();
ClasseB b = new ClasseB ();
b.metodo_qualunque ( a );
succederebbe questo:
nello stack creati dinamicamente due celle di memoria per le variabili reference a e b, le quali puntano agli oggetti reali che vengono allocati dinamicamente nell'heap e che richiedono tanto spazio quanto ne necessitino, a seconda del numero di parametri d'istanza e quant'altro.
Nel momento in cui viene chiamato metodo_qualunque sulla vairiabile b, si crea cosa nello spazio dei metodi?
Mi viene da pensare che venga allocato, ma non so come, uno spazio nella memoria dei metodi che contenga i valori attuali dei campi di istanza dell'oggetto a, i quali, presumibilmente contribuiranno a variare lo stato del chiamante b.
E' vero tutto cio' o nonostante tutto ho ancora scritto baggianate>???