Eliminazione di PermGen in JDK 8


Risposte:


358

Le ragioni per ignorare questi argomenti sono la rimozione permanente della generazione in HotSpot per JDK8 a causa dei seguenti inconvenienti

  • Dimensioni fisse all'avvio - difficili da ottimizzare.
  • I tipi di hotspot interni erano oggetti Java: potevano muoversi con GC completo, opaco, non fortemente tipizzato e difficile da eseguire il debug, con meta-metadati necessari.
  • Semplifica le raccolte complete: iteratori speciali per metadati per ciascun raccoglitore
  • Vuoi deallocare i dati di classe contemporaneamente e non durante la pausa GC
  • Abilita i miglioramenti futuri che sono stati limitati da PermGen.

Lo spazio di generazione permanente (PermGen) è stato completamente rimosso ed è sostituito da un nuovo spazio chiamato Metaspace. Le conseguenze della rimozione di PermGen è che ovviamente gli argomenti JVM PermSize e MaxPermSize vengono ignorati e non si otterrà mai un errore java.lang.OutOfMemoryError: PermGen.

Vantaggi di MetaSpace

  • Sfrutta la proprietà delle specifiche del linguaggio Java: le classi e la durata dei metadati associati corrispondono al caricatore di classi
  • Area di memoria per caricatore - Metaspace
  • Solo allocazione lineare
  • Nessun recupero individuale (ad eccezione di RedefineClasses e errore di caricamento della classe)
  • Nessuna scansione o compattazione GC
  • Nessun trasferimento per gli oggetti metaspace

Sintonizzazione metaspace

La dimensione massima del metaspace può essere impostata usando il flag -XX: MaxMetaspaceSize e il valore predefinito è illimitato, il che significa che solo la memoria di sistema è il limite. Il flag di ottimizzazione -XX: MetaspaceSize definisce la dimensione iniziale di metaspace Se non si specifica questo flag, Metaspace ridimensionerà dinamicamente in base alla richiesta dell'applicazione in fase di runtime.

Il cambiamento consente altre ottimizzazioni e funzionalità in futuro

  • Condivisione dei dati della classe di applicazione
  • Ottimizzazioni di raccolta giovani, scarico classe G1
  • Riduzioni delle dimensioni dei metadati e progetti di impronta JVM interna

C'è anche una prestazione GC migliorata. Più dettaglio


29
Devo dire che le stringhe internate erano precedentemente memorizzate nello spazio PermGen, ma erano state spostate nell'heap Java principale in Java 7.
gparyani,

Grazie per la spiegazione dettagliata.
Pradeep,

3
Un po 'di gentile introduzione per il pubblico generale (intendo principalmente persone non Java, ad esempio compagni devops che hanno a che fare con JVM) non danneggerebbe questa risposta.
Ulidtko,


19

Lo spazio di generazione permanente (PermGen) è stato completamente rimosso ed è in qualche modo sostituito da un nuovo spazio chiamato Metaspace. Le conseguenze della rimozione di PermGen è che ovviamente gli argomenti JVM PermSize e MaxPermSize vengono ignorati e non si verificherà mai un java.lang.OutOfMemoryErrorerrore: PermGen. JDK 8 HotSpot JVM ora utilizza la memoria nativa per la rappresentazione di metadati di classe e si chiama Metaspace. Leggi di più >>


3
'HotSpot JVM ora utilizza la memoria nativa per la rappresentazione di metadati di classe. - e quale memoria HotSpot JVM ha usato in precedenza? E qual è l'esattezza della "memoria nativa"?
Andrey M. Stepanov,


12

Lo spazio PermGen viene sostituito da MetaSpace in Java 8. Gli argomenti JVM PermSize e MaxPermSize vengono ignorati e viene emesso un avviso se presente all'avvio.

La maggior parte delle allocazioni per i metadati della classe sono ora allocate dalla memoria nativa. * Le classi utilizzate per descrivere i metadati delle classi sono state rimosse.

La differenza principale tra il vecchio PermGen e il nuovo MetaSpace è che non è necessario definire un limite massimo di utilizzo della memoria. Puoi mantenere illimitato il limite di spazio MetaSpace. Pertanto, quando aumenta l'utilizzo della memoria non si otterrà l'errore OutOfMemoryError. La memoria nativa riservata viene invece aumentata per riempire completamente l'aumento dell'utilizzo della memoria.

È possibile definire il limite massimo di spazio per MetaSpace, quindi verrà generato OutOfMemoryError: spazio metadati. Pertanto è importante definire questo limite con cautela, in modo da evitare sprechi di memoria.


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.