Java heap terminologia: le generazioni giovani, anziani e permanenti?
-
22-09-2019 - |
Domanda
Sto cercando di capire quali sono i concetti di giovane , vecchia e generazioni permanenti sono nella terminologia 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 / riferiscono l'uno all'altro?
Soluzione
Questo mi sembra un malinteso comune. In JVM Oracle, la generazione permanente non è parte del mucchio. Si tratta di uno spazio separato per definizioni di classi e dei relativi dati. In Java 6 e versioni precedenti, le stringhe internati sono stati memorizzati nella generazione permanente. In Java 7, stringhe internati vengono memorizzate nel mucchio oggetto principale.
Ecco un buon post su generazione permanente.
Mi piacciono le descrizioni fornite per ogni spazio in di Oracle guida su JConsole :
Per la HotSpot Java VM, la memoria piscine per la raccolta dei rifiuti di serie sono i seguenti.
- Eden spaziale (cumulo): Il pool da cui memoria viene inizialmente allocata per la maggior parte degli oggetti.
- Survivor Spazio (heap): La piscina che contiene oggetti che sono sopravvissuti la raccolta dei rifiuti del Eden spazio.
- Tenured Generation (heap): La piscina che contiene oggetti che sono esistiti per qualche tempo nello spazio sopravvissuto.
- Generazione permanente (non-heap): La piscina contenente tutte le riflettente dati della macchina virtuale stessa, come oggetti di classe e metodi. Con Java VM che utilizzano la condivisione dei dati di classe, questa generazione è diviso in di sola lettura e di lettura-scrittura aree.
- Codice Cache (non-heap): La HotSpot Java VM include anche una cache di codice, contenente memoria utilizzata per raccolta e conservazione dei nativi codice.
Java utilizza garbage collection generazionale. Questo significa che se si dispone di un oggetto foo (che è un'istanza di una classe), gli altri eventi di raccolta dei rifiuti sopravvive (se ci sono ancora riferimenti ad esso), l'ulteriore che viene promosso. Si inizia nella giovane generazione (che a sua volta è suddivisa in spazi multipli - Eden e Survivor). E sarebbe alla fine finiscono nella generazione di ruolo, se è sopravvissuto abbastanza a lungo
Altri suggerimenti
Il mucchio è diviso in generazioni giovani e meno giovani nel seguente modo:
Young Generation : E 'luogo dove ha vissuto per breve periodo ed è suddiviso in due spazi:
- Eden Spazio : Quando un oggetto creata usando nuova memoria allocata parola chiave in questo spazio.
- Survivor Spazio : Questa è la piscina che contiene oggetti che hanno sopravvissuto dopo la raccolta dei rifiuti java dallo spazio Eden.
Old Generation : Questa piscina contiene essenzialmente di ruolo e virtuale (Riservato) spazio e sarà in possesso di quegli oggetti che sono sopravvissuti dopo la raccolta dei rifiuti da Young Generation.
- Titolare Spazio:. Questo pool di memoria contiene oggetti che sono sopravvissuti dopo più raccolta dei rifiuti significa oggetto che è sopravvissuto dopo la garbage collection dallo spazio Survivor
Generazione permanente:. Questo pool di memoria come il nome dice anche contenere i metadati di classe permanente e descrittori informazioni così lo spazio PermGen sempre riservato per le classi e di quelli che è legato alle classi ad esempio i membri statici
Java8 Aggiornamento:. PermGen viene sostituito con Metaspace che è molto simile
La differenza principale è che Metaspace ri-formati in modo dinamico vale a dire, è possibile espandere in fase di esecuzione.
Java Metaspace spazio: senza limiti (di default)
Codice cache (virtuale o riservato): Se si utilizza HotSpot Java VM questo include prefisso cache che contiene la memoria che verrà utilizzato per la compilazione e lo stoccaggio di codice nativo
.
Qual è la giovane generazione?
Young Generation è dove tutti i nuovi oggetti sono allocati e invecchiato. Quando la giovane generazione si riempie, questo provoca una garbage collection minore. Un giovane generazione piena di oggetti morti viene raccolto molto rapidamente. Alcuni sopravvissuti oggetti sono di età compresa e poi passare alla vecchia generazione.
Qual è la vecchia generazione?
vecchia generazione è usato per memorizzare gli oggetti lungo sopravviventi. In genere, una soglia è fissata per oggetto la generazione giovane e quando che l'età è soddisfatta, l'oggetto viene spostato alla vecchia generazione. Alla fine la vecchia generazione ha bisogno di essere raccolti. Questo evento è chiamato importante raccolta dei rifiuti
Qual è la generazione permanente?
generazione permanente contiene metadati richiesti da JVM per descrivere le classi ei metodi utilizzati nell'applicazione. La generazione permanente è popolato da JVM in fase di esecuzione basato su classi in uso presso l'applicazione.
PermGen è stato sostituito con Metaspace dal Java 8 rilascio.
& PermSize MaxPermSize parametri verranno ignorati ora
In che modo le tre generazioni interagiscono / riferiscono l'uno all'altro?
Fonte immagine & oracolo technetwork articolo tutorial: http: //www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
" La collezione Processo Garbage generale " nel suddetto articolo spiega le interazioni tra di loro con molti schemi.
Date un'occhiata a schema riassuntivo:
La macchina virtuale Java è organizzata in tre generazioni: una giovane generazione, una vecchia generazione, e una generazione permanente. La maggior parte degli oggetti sono inizialmente allocati nella giovane generazione. La vecchia generazione contiene oggetti che sono sopravvissute alcune serie di collezioni di giovani generazioni, così come alcuni oggetti di grandi dimensioni che possono essere allocati direttamente nella vecchia generazione. La generazione permanente contiene oggetti che la JVM considerate da conveniente avere garbage collector gestore, come oggetti che descrivono classi e metodi, nonché le classi ei metodi stessi.
Memoria in SunHotSpot JVM è organizzata in tre generazioni: giovani generazioni, di vecchia generazione e di generazione permanente.
- Young Generation:. Gli oggetti appena creati vengono assegnati alla giovane generazione
- vecchia generazione: se le nuove richieste di oggetti di uno spazio più grande mucchio, si arriva direttamente allocati nella vecchia gen. Anche gli oggetti che sono sopravvissuti alcuni cicli GC viene promosso alla vecchia generazione cioè vissuto a lungo casa oggetti nella vecchia gen.
- Generazione permanente:. La generazione permanente contiene oggetti che la JVM considerate da conveniente avere garbage collector gestore, come oggetti che descrivono classi e metodi, nonché le classi ei metodi stessi
FYI:. Il gen permanente non è considerata una parte del mucchio Java
Come funziona il tre generazioni interagiscono / riferiscono l'uno all'altro? Oggetti (tranne quelli grandi) vengono prima assegnati alle giovani generazioni. Se un oggetto rimane vivo dopo x n. dei cicli di raccolta della spazzatura che viene promosso al vecchio / di ruolo gen. Quindi possiamo dire che la giovane generazione contiene gli oggetti di breve durata, mentre la vecchia generazione contiene gli oggetti che hanno una lunga vita. Il gen permanente non interagisce con gli altri due generazioni.