Recentemente ho letto bit e frammenti sulla garbage collection (principalmente in Java) e una domanda rimane ancora senza risposta: come fa una JVM (o il sistema di runtime in generale) a tenere traccia degli oggetti live CURRENTLY?Garbage collection - root node
Capisco che ci siano gli oggetti attualmente in pila, quindi tutte le variabili locali oi parametri di funzione, che sono oggetti. Il problema con questo approccio è che ogni volta che il sistema di runtime verifica quello che è attualmente in pila, in che modo distinguerebbe tra una variabile di riferimento e una semplice int? non può, vero?
Pertanto, ci deve essere una sorta di meccanismo per consentire runtime di costruire primo elenco di oggetti in tempo reale di passare per la fase mark-sweep ...
Quindi tutto sommato è piuttosto una differenziazione di basso livello, piuttosto che JVM? Ma JVM ha un tipo di riferimento dichiarato per il bytecode, quindi perché non usarlo? Sei sicuro che sia così basso livello piuttosto che a livello di codice byte? – Bober02
Per quanto ne so (basato sia sul collegamento che ho dato in precedenza, sia sulla navigazione dei codici di diverse implementazioni JVM), sono certo che la mia comprensione sia giusta. Puoi semplicemente immergerti nei codici GC di alcune implementazioni JVM open source per verificarlo. Hanno tutti bisogno di camminare per vedere il riferimento. Tuttavia, forse i criteri utilizzati per verificare se uno slot è di riferimento o meno è leggermente diverso (la maggior parte di essi verifica a e eb, per c, si basa davvero sull'implementazione). – Rainfield
Perché non usare il bytecode, questa è la mia comprensione (non sono sicuro che sia giusto o no). GC è una cosa di runtime, ma i bytecode sono generati in fase di compilazione e statici. Quando si verifica un GC, il sistema di runtime deve trovare le radici e seguirle per scoprire gli oggetti in tempo reale. . Per fare ciò, devi effettivamente controllare il valore in ogni slot del frame stack, anche se sai che questo slot contiene un riferimento in fase di compilazione (come ha detto greyfairer, lo sai osservando il bytecode). Perché è necessario conoscere il valore di riferimento esatto per trovare altri oggetti nell'heap. – Rainfield