Garabage collection

di il
8 risposte

Garabage collection

Sera a tutti, ho problemi con il seguente esercizio. La traccia recita "Quanti oggetti al massimo possono essere deallocati dal garbage collection nel punto indicato?" La risposta esatta è 2. Come arriva alla conclusione?

class Sirio extends Stella
{
    String nome = "Sirio";
}

public class Stella
{
    String nome = "";
}

public static void main (String[] argv)
{
  Sirio s1 = new Sirio();
  Stella s2 = new Stella();
  s1 = s2;
  s2 = null; //QUI
}
Mi sarebbe utili perlopiù una spiegazione generale del garbage collection. Non ho trovato molto su internet, ho capito solamente che il garbage collection si occupa di deallocare automaticamente i "cadaveri" del programma, funzione importante che prima svolgeva il programmatore.

8 Risposte

  • Re: Garabage collection

    giulio0 ha scritto:


    Mi sarebbe utili perlopiù una spiegazione generale del garbage collection. Non ho trovato molto su internet, ho capito solamente che il garbage collection si occupa di deallocare automaticamente i "cadaveri" del programma, funzione importante che prima svolgeva il programmatore.
    Partiamo da alcuni concetti basilari: un oggetto diventa eleggibile per il garbage collection solamente quando risulta NON più "raggiungibile".
    Il concetto di "raggiungibilità" è abbastanza semplice: se a partire da un insieme di "radici" (spiego più avanti) è possibile tracciare un cammino attraverso i reference che porti direttamente o indirettamente all'oggetto, allora si dice che quell'oggetto è raggiungibile. E NON può assolutamente essere toccato dal g.c.

    Le radici di cui parlavo sono sostanzialmente (vado a memoria): tutte le variabili allocate sugli stack-frame in tutti gli stack (ogni thread ha il suo stack) PIU' tutte le variabili "di classe" (static) che ci sono nei vari tipi (classi, ecc...)
    Queste sono, in linea generale, le radici da cui si parte. Se si può tracciare un cammino verso l'oggetto, è raggiungibile.

    Attenzione, che "raggiungibile" è diverso dal "referenziato". Due oggetti potrebbero referenziarsi tra di loro e NON essere raggiungibili. I garbage collector "moderni" sono in grado di determinarlo e possono tranquillamente prendere e liberare la memoria di quei due oggetti.
  • Re: Garabage collection

    Va bene. Provo a dare una risposta: s1 ed s2 sono i due oggetti che vengono istanziati nel main, quindi abbiamo due oggetti caricati. s2 viene posto uguale a null che secondo la teoria è eleggibile a deallocazione (primo oggetto deallocabile), mentre il puntatore della variabile di s1 punta al litterale "Sirio" quindi diventa deallocabile (????)

    Mi correggo: l'istanza di s1 diventa deallocabile quando s1 = s2.
  • Re: Garabage collection

    Tra l'altro (non l'ho notato subito), quel s1 = s2 è SBAGLIATO.
    s1 è di tipo Sirio (la sotto-classe) e NON gli puoi assegnare una variabile del tipo della super-classe (Stella).
  • Re: Garabage collection

    giulio0 ha scritto:


    Va bene. Provo a dare una risposta: s1 ed s2 sono i due oggetti che vengono istanziati nel main, quindi abbiamo due oggetti caricati. s2 viene posto uguale a null che secondo la teoria è eleggibile a deallocazione (primo oggetto deallocabile), mentre il puntatore della variabile di s1 punta al litterale "Sirio" quindi diventa deallocabile (????)

    Mi correggo: l'istanza di s1 diventa deallocabile quando s1 = s2.
    Vado a memoria, ma se non ricordo male l'esercizio è fatto apposta per trarti in inganno.

    È s1 che non è più raggiungibile perché con s1 = s2 i riferimenti passano a s2 e l'istanza originale di s1 non è più raggiungibile, di conseguenza nemmeno nome della prima istanza, quindi 2 oggetti
  • Re: Garabage collection

    L'unica risposta corretta l'ha data (implicitamente) andbin: 0.
    L'istruzione s1 = s2 è sbagliata, quindi quel codice NON COMPILA. Se il codice non compila, non può essere mandato in esecuzione. Se non può essere mandato in esecuzione, nessun oggetto verrà istanziato. Se non viene istanziato nessun oggetto, nessun oggetto può essere deallocato dal GC.

    Ciao.
  • Re: Garabage collection

    Ammettiamo che il codice sia s1 = (Sirio) s2 quindi esplicitando il casting (poiché è un downcast) allora la risposta 2 sarebbe corretta come detto e come confermato da Weierstrass?
  • Re: Garabage collection

    giulio0 ha scritto:


    Ammettiamo che il codice sia s1 = (Sirio) s2 quindi esplicitando il casting (poiché è un downcast
    No. Ora corretto a livello di compilazione (è "possibile" che s2 faccia riferimento ad un oggetto davvero di tipo Sirio, quindi il cast è sensato).
    Ma FALLISCE a runtime. A s2 è assegnato un oggetto Stella. Che non soddisfa la relazione "è-un Sirio".
    Stop.
  • Re: Garabage collection

    giulio0 ha scritto:


    Ammettiamo che il codice sia s1 = (Sirio) s2 quindi esplicitando il casting (poiché è un downcast) allora la risposta 2 sarebbe corretta come detto e come confermato da Weierstrass?
    No, ha ragione andbin e va in errore di runtime, tuttavia non credo che il tuo professore vi abbia dato davvero un esercizio del genere: che senso ha chiedere gli oggetti eleggibili per il garbage collector quando il codice non compila? Non è che l'esercizio fosse per caso questo?
    
            Stella s1 = new Sirio();
            Stella s2 = new Stella();
            s1 = s2;
            s2 = null; //QUI
    
Devi accedere o registrarti per scrivere nel forum
8 risposte