Terminologia dell'heap Java: generazioni giovani, vecchie e permanenti?


318

Sto cercando di capire quali sono i concetti di generazioni giovani , vecchie e permanenti nella terminologia dell'heap Java e, più specificamente, le interazioni tra le tre generazioni.

Le mie domande sono:

  • Qual è la giovane generazione?
  • Qual è la vecchia generazione?
  • Qual è la generazione permanente?
  • In che modo le tre generazioni interagiscono / si relazionano tra loro?

Supponendo che tu stia parlando di Sun JDK / OpenJDK, consulta la pagina sul sito Web OpenJDK su Gestione archiviazione . Ci sono un paio di collegamenti per ulteriori informazioni in fondo.
Nicholas Riley,

1
anche collegato a questa domanda "generazione di ruolo"
gstackoverflow

Risposte:


304

Questo sembra un malinteso comune. In Oracle JVM, la generazione permanente non fa parte dell'heap. È uno spazio separato per le definizioni di classe e i dati correlati. In Java 6 e precedenti, anche le stringhe internate venivano archiviate nella generazione permanente. In Java 7, le stringhe internate sono memorizzate nell'heap dell'oggetto principale.

Ecco un buon post sulla generazione permanente .

Mi piacciono le descrizioni fornite per ogni spazio nella guida di Oracle su JConsole :

Per la VM Java HotSpot, i pool di memoria per la garbage collection seriale sono i seguenti.

  • Eden Space (heap): il pool dal quale la memoria è inizialmente allocata per la maggior parte degli oggetti.
  • Survivor Space (heap): la piscina contenente oggetti che sono sopravvissuti alla raccolta dei rifiuti dello spazio Eden.
  • Tenured Generation (heap): il pool contenente oggetti che esistono da tempo nello spazio dei sopravvissuti.
  • Generazione permanente (non heap): il pool contenente tutti i dati riflettenti della macchina virtuale stessa, come oggetti classe e metodo. Con le macchine virtuali Java che utilizzano la condivisione dei dati di classe, questa generazione è suddivisa in aree di sola lettura e di lettura / scrittura.
  • Cache di codice (non heap): la VM Java di HotSpot include anche una cache di codice, contenente memoria utilizzata per la compilazione e l'archiviazione del codice nativo.

Java utilizza la garbage collection generazionale. Ciò significa che se hai un oggetto foo (che è un'istanza di qualche classe), più eventi di garbage collection sopravvivono (se ci sono ancora riferimenti ad esso), più viene promosso. Inizia nella giovane generazione (che a sua volta è divisa in più spazi - Eden e Survivor) e finirebbe con la generazione di ruolo se sopravvisse abbastanza a lungo.


2
Credo che a partire da Java 7, le stringhe non siano più internate nella generazione permanente.
Tim Goodman,

Hai ragione, sono sorpreso che sia sopravvissuto così tanto prima di una menzione. Quindi in Java 8 la generazione permanente verrà sostituita da metaspace (anche se non sono sicuro di quanto sarà diverso, oltre a non essere limitato per impostazione predefinita)
Joshua McKinnon,

9
Joshua - "vecchio" è sinonimo di "possesso", ed è "nuovo" sinonimo di "sopravvissuto?"
Joadha,

1
il permesso è applicabile solo prima di Java 8.
lwpro2

2
Se stai ancora aspettando una risposta, sì, hai ragione @joadha. Dai
recepinanc

197

Il mucchio è diviso in giovani e vecchie generazioni come segue:

Young Generation : è un luogo dove visse per un breve periodo e diviso in due spazi:

  • Eden Space : quando l'oggetto viene creato utilizzando la nuova memoria di parole chiave allocata su questo spazio.
  • Spazio sopravvissuto : questa è la piscina che contiene oggetti sopravvissuti dopo la raccolta di rifiuti java dallo spazio Eden.

Old Generation : questo pool contiene fondamentalmente spazio (riservato) virtuale e di proprietà e conterrà quegli oggetti sopravvissuti dopo la raccolta dei rifiuti di Young Generation.

  • Spazio posseduto: questo pool di memoria contiene oggetti sopravvissuti dopo la raccolta multipla dei rifiuti significa oggetto sopravvissuto dopo la raccolta dei rifiuti dallo spazio Sopravvissuto.

Generazione permanente: questo pool di memoria come dice il nome contiene anche metadati di classe permanenti e informazioni sui descrittori, quindi lo spazio PermGen è sempre riservato per le classi e quelle che sono legate alle classi, ad esempio i membri statici.

Aggiornamento Java8: PermGen viene sostituito con Metaspace che è molto simile.
La differenza principale è che Metaspace si ridimensiona in modo dinamico, cioè può espandersi in fase di esecuzione.
Spazio Java Metaspace: illimitato (impostazione predefinita)

Cache di codice (virtuale o riservata): se si utilizza HotSpot Java VM, questa include un'area di cache del codice che contiene memoria che verrà utilizzata per la compilazione e l'archiviazione del codice nativo.

inserisci qui la descrizione dell'immagine

Cortesia


@Premraj cosa significa Metaspace ridimensiona in modo dinamico, ovvero può espandersi in fase di esecuzione. ? L'unica differenza che per impostazione predefinita non ha bordo?
gstackoverflow,

1
eccellente..posso sapere dove risiede l'area del metodo, il nativestack e il pool costante di runtime in questa immagine? e cosa tengono di conseguenza?

se la cache del codice viene utilizzata per il codice del metodo nativo, cosa avrà lo stack del metodo nativo (ogni thread ne avrà uno)?

49

Qual è la giovane generazione?

The Young Generation è dove tutti i nuovi oggetti vengono allocati e invecchiati. Quando la giovane generazione si riempie, ciò provoca una raccolta di rifiuti minore. Una giovane generazione piena di oggetti morti viene raccolta molto rapidamente. Alcuni oggetti sopravvissuti invecchiano e alla fine passano alla vecchia generazione.

Qual è la vecchia generazione?

La vecchia generazione viene utilizzata per conservare oggetti sopravvissuti a lungo. In genere, viene impostata una soglia per l'oggetto generazione giovane e quando tale età viene raggiunta, l'oggetto viene spostato alla generazione precedente. Alla fine è necessario raccogliere la vecchia generazione. Questo evento è chiamato un'importante raccolta di rifiuti

Qual è la generazione permanente?

La generazione permanente contiene metadati richiesti dalla JVM per descrivere le classi e i metodi utilizzati nell'applicazione. La generazione permanente viene popolata da JVM in fase di esecuzione in base alle classi in uso dall'applicazione.

PermGen è stato sostituito con Metaspace dalla versione Java 8.

I parametri PermSize e MaxPermSize verranno ora ignorati

In che modo le tre generazioni interagiscono / si relazionano tra loro?

inserisci qui la descrizione dell'immagine

Articolo tutorial sull'immagine tecnica dell'oracolo e della fonte: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" Il processo generale di raccolta dei rifiuti " nell'articolo precedente spiega le interazioni tra loro con molti diagrammi.

Dai un'occhiata al diagramma riassuntivo:

inserisci qui la descrizione dell'immagine


eccellente..posso sapere dove risiede l'area del metodo, il nativestack e il pool costante di runtime in questa immagine? e cosa tengono di conseguenza?

consultare docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html per maggiori dettagli. L'area del metodo viene creata all'avvio della macchina virtuale. Sebbene l'area del metodo sia logicamente parte dell'heap, le implementazioni semplici possono scegliere di non raccogliere la spazzatura o compattarla. Ogni pool di costanti di runtime viene allocato dall'area dei metodi della macchina virtuale Java
Ravindra babu,

sei sicuro ... sto leggendo che la sua parte dello spazio permgen (che non è un mucchio)? journaldev.com/2856/…

La documentazione di Oracle è più autentica
Ravindra babu,

La soglia è impostata per l'oggetto di generazione giovane in unità di tempo (ad es. Ms)? o round GC?
Molto obiettivo

16

La macchina virtuale Java è organizzata in tre generazioni: una generazione giovane, una generazione vecchia e una generazione permanente. La maggior parte degli oggetti sono inizialmente allocati nelle giovani generazioni. La vecchia generazione contiene oggetti che sono sopravvissuti a un certo numero di raccolte di giovani generazioni, nonché alcuni oggetti di grandi dimensioni che possono essere allocati direttamente nella vecchia generazione. La generazione permanente contiene oggetti che JVM trova conveniente per gestire il garbage collector, come oggetti che descrivono classi e metodi, nonché le classi e i metodi stessi.


1

La memoria in SunHotSpot JVM è organizzata in tre generazioni: generazione giovane, generazione vecchia e generazione permanente.

  • Young Generation: gli oggetti appena creati vengono assegnati alla giovane gen.
  • Vecchia generazione: se il nuovo oggetto richiede uno spazio heap più grande, viene allocato direttamente nella vecchia generazione. Anche gli oggetti che sono sopravvissuti ad alcuni cicli GC vengono promossi alla vecchia generazione, ovvero la casa di oggetti di lunga durata nella vecchia generazione.
  • Generazione permanente: la generazione permanente contiene oggetti che JVM trova conveniente per gestire il garbage collector, come oggetti che descrivono classi e metodi, nonché le classi e i metodi stessi.

A proposito: la gen permanente non è considerata una parte dell'heap Java.

In che modo le tre generazioni interagiscono / si relazionano tra loro? Gli oggetti (tranne quelli grandi) vengono inizialmente assegnati alle giovani generazioni. Se un oggetto rimane vivo dopo x no. dei cicli di raccolta dei rifiuti viene promosso alla vecchia generazione. Quindi possiamo dire che il giovane gen contiene gli oggetti di breve durata mentre il vecchio gen contiene gli oggetti che hanno una lunga vita. La gen permanente non interagisce con le altre due generazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.