Questa è più di una domanda teorica. Se jvm è implementato in go, che è un linguaggio spazzato, allora jvm ha bisogno di un garbage collector separato da implementare per la propria operazione?
Questa è più di una domanda teorica. Se jvm è implementato in go, che è un linguaggio spazzato, allora jvm ha bisogno di un garbage collector separato da implementare per la propria operazione?
No, può fare affidamento sul garbage collector della lingua ospite. Ovviamente si deve fare attenzione a non fare riferimento alla memoria che è logicamente irraggiungibile (non raggiungibile dal programma guest e non necessaria per la VM). Ma ciò non è fondamentalmente diverso dall'evitare "fughe di memoria logica" (trattenendo sulla memoria non è necessario più) in qualsiasi altro programma scritto nella lingua ospite.
Un esempio è RPython. Sebbene sia inusuale che i garbage collector di RPython siano scritti in (un sottosistema di basso livello a gestione manuale della memoria) RPython, tutti gli altri codici RPython agiscono quasi interamente come un normale linguaggio spazzatura. Una macchina virtuale scritta in RPython rappresenta tutti gli oggetti di linguaggio guest (e quasi tutti gli oggetti necessari solo per i loro scopi interni) come oggetti RPython raccolti tramite garbage, piuttosto che implementare un secondo GC solo per la lingua ospite. Ad esempio, in PyPy esiste la classe base W_Root
. Tutto ciò che è in un certo senso un oggetto Python eredita da esso, ma la gestione della memoria per esso e le sue sottoclassi viene lasciato ai garbage collector a livello di RPython.
Sì, lo fa. Il motivo è che la garbage collection può solo recuperare risorse inaccessibili, ma ciò che è accessibile dipende dal livello di visualizzazione del sistema.
L'host VM implementa la garbage collection per recuperare la memoria utilizzata dal programma guest, ma ora rilasciata. Nel tuo caso, il programma guest è un'altra VM e i suoi ospiti sono programmi applicativi. Quando un programma applicativo utilizza e scarta la memoria, non ha più un handle per quella memoria, quindi non può mai utilizzare nuovamente i valori memorizzati. Quella, tuttavia, è una condizione che solo la VM ospite può controllare.
Dal punto di vista della VM host, tutta la memoria passata alla VM guest per l'applicazione è stata prima distribuita dalla VM host alla VM guest e la VM guest ha ancora un handle per quella memoria (ha ha per avere un handle, altrimenti non sarebbe possibile per la VM guest implementare la garbage collection). Ne consegue che se la macchina virtuale guest non recupera un blocco di memoria, la VM dell'host non può recuperare la memoria, le risorse perdono e alla fine si può esaurire. In generale, la garbage collection o un'altra forma di recupero delle risorse è necessaria per ogni livello di virtualizzazione che comporta un cambio di proprietà delle risorse fisiche.
Leggi altre domande sui tag garbage-collection go virtual-machine