Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13

Discussione: [Java] Stack - Heap

  1. #11
    piccolo UP quotidiano...

  2. #12
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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.
    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
    Tale variabile punta ad un oggetto di tipo MiaClasse allocato (STATICAMENTE???) nell'heap.
    Allocato dinamicamente sul heap.

    Originariamente inviato da ragnonerodocet
    E come fa tale oggetto a puntare a sua volta ai campi a, b, c e d?
    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.

    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 developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #13
    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>???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.