Quale parte della memoria è utilizzata per il Garbage Collector?

5

Capisco le divisioni di memoria di Heap come Young, Tenured e Perm Gen. Ma io sono solo curioso di sapere dove viene utilizzata la memoria per eseguire Garbage Collector stesso? Proviene da uno di questi spazi di memoria o dagli stack di thread?

    
posta Siva 23.11.2012 - 03:28
fonte

4 risposte

4

La risposta dipende da cosa intendi per "la memoria utilizzata per eseguire Garbage Collect [ion]" ... e per quale garbage collector di cui stai parlando.

La risposta generale è che diversi algoritmi di garbage collection usano lo spazio in modo diverso. Questo è un riepilogo molto elevato / semplificato:

  • Quasi tutti i garbage collector utilizzano uno o più bit "mark" nell'intestazione di ogni oggetto per registrare che l'oggetto è stato elaborato dal GC.

  • La copia dei collector funziona copiando oggetti live da uno spazio "from" a uno spazio "to" e nel caso semplice non è necessario alcuno spazio aggiuntivo.

  • I segnaposto / spazzino funzionano girando ricorsivamente il grafico degli oggetti "raggiungibili". La ricorsione può essere eseguita in modo esplicito (che richiede uno stack separato) o mediante un intelligente trucco di inversione del puntatore (cercare l'algoritmo di Cheney).

  • In genere i collector concorrenti richiedono memoria extra per tenere traccia degli oggetti che vengono mutati mentre il garbage collector è in esecuzione.

Ci sono interi libri sul tema della raccolta dei rifiuti. Se vuoi capire davvero come funzionano i raccoglitori di rifiuti, hai un sacco di letture da fare.

In generale, qualsiasi memoria aggiuntiva che il GC deve svolgere il proprio lavoro verrà in genere allocata al di fuori degli spazi heap attivi. La memoria dello stack di thread non viene utilizzata ... a parte lo stack di thread per il thread di raccolta dati obsoleti o i thread stessi.

La tua menzione di "giovane", "di ruolo" e "permgen" suggerisce che stai parlando di GC Java classici. Questi sono collezionisti generazionali, che è un sottotipo di collezionisti di copie.

    
risposta data 23.11.2012 - 13:37
fonte
2

I Garbage Collector eseguono una ricerca dell'heap del programma dalle sue GC Root per identificare ciò che è vivo.

C'è un astuto trucco che puoi eseguire quando intraprendi questa attività che evita di richiedere la memoria dello stack per l'attraversamento. Quando si esegue un DFS in un determinato nodo, è necessario conoscere il nodo del predecessore, quindi invertire i puntatori all'interno della struttura heap stessa. Ad esempio, se il tuo heap ha questo aspetto:

A - > B

B - > C

B - > D

E cerchi da A, a B, a C. Inverti i puntatori, quindi appariranno in questo modo:

B - > A

C - > B

B - > D

In questo modo, quando si effettua una raccolta di dati inutili, è possibile percorrere un grafico di dimensioni arbitrarie, pur richiedendo solo una quantità costante di memoria. Hai solo bisogno di due puntatori in memoria per camminare su qualsiasi grafico: uno per fare riferimento al tuo nodo corrente e uno per i fratelli.

È un trucco abbastanza carino.

    
risposta data 23.11.2012 - 11:34
fonte
2

Poiché Java è stato progettato attorno all'idea di avere una macchina virtuale, non esiste in realtà una risposta singola e corretta per questa domanda.

L'unica certezza è che la VM implementerà il set di istruzioni correttamente. Esistono due istruzioni JVM, new e newarray , che allocano spazio per oggetti e matrici. Qualunque cosa al di là di questo è un dettaglio di implementazione che è destinato a rimanere nascosto.

La malloc() risposta di AlexGaynor è probabilmente valida nella maggior parte delle implementazioni per ambienti POSIX-y (Unix, Windows, VxWorks, ecc.), dove la prassi abituale è quella di collocare la memoria allocata dinamicamente nell'heap del sistema host. Nulla nella specifica JVM preclude le implementazioni in altri ambienti con altri modelli di memoria:

The Java virtual machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor's system requirements.

Finché la JVM implementa qualcosa che appare nel programma Java come un heap, tutto va bene. La specifica dichiara esplicitamente che deve essere garbage collection, e su un host ipotetico con memoria infinita, sarebbe completamente inutile.

    
risposta data 23.11.2012 - 14:21
fonte
1

Qualsiasi memoria che il GC stesso deve operare è una memoria di stack (per calcoli temporanei che fa), o dall'heap "raw", che utilizza il sistema malloc , o chiama manualmente mmap .

    
risposta data 23.11.2012 - 05:54
fonte

Leggi altre domande sui tag