Eliminazione di PermGen in JDK 8

Ho installato JDK 8 e sto provando ad eseguire Eclipse. Ricevo il seguente messaggio di avviso:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0 

Quali sono le ragioni per ignorare questo argomento?

Le ragioni per ignorare questi argomenti è che la generazione permanente è stata rimossa in HotSpot per JDK8 a causa dei seguenti inconvenienti

  • Dimensione fissa all’avvio – difficile da regolare.
  • I tipi di Hotspot interno erano oggetti Java: potevano spostarsi con GC completi, opachi, non fortemente tipizzati e difficili da debug, metadati necessari.
  • Semplifica raccolte complete: iteratori speciali per i metadati per ciascun raccoglitore
  • Vuoi deallocare i dati di class contemporaneamente e non durante la pausa GC
  • Abilita i miglioramenti futuri che sono stati limitati da PermGen.

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

Vantaggi di MetaSpace

  • Approfitta della proprietà Specifica linguaggio Java: le classi e le durate associate ai metadati corrispondono ai caricatori di classi
  • Area di stoccaggio per caricatore – Metaspace
  • Assegnazione lineare solo
  • Nessuna richiesta individuale (tranne RedefineClasses e errore di caricamento della class)
  • Nessuna scansione o compattazione del GC
  • Nessuna rilocazione per oggetti metaspace

Metaspace Tuning

La dimensione massima di metaspace può essere impostata utilizzando il flag -XX: MaxMetaspaceSize e il valore predefinito è illimitato, il che significa che solo la memoria di sistema è il limite. L’opzione -XX: MetaspaceSize tuning flag definisce la dimensione iniziale di metaspace Se non si specifica questo flag, il metaspace verrà ridimensionato dynamicmente in base alla richiesta dell’applicazione in fase di esecuzione.

Modifica consente altre ottimizzazioni e funzionalità in futuro

  • Condivisione dei dati delle classi di applicazioni
  • Ottimizzazioni della collezione giovane, scarico class G1
  • Riduzioni delle dimensioni dei metadati e progetti interni dell’impronta JVM

C’è anche un miglior GC performace. Più dettaglio

Questa è una delle nuove funzionalità di Java 8, parte di JDK Enhancement Proposals 122 :

Rimuovere la generazione permanente dalla JVM Hotspot e quindi la necessità di ottimizzare la dimensione della generazione permanente.

L’elenco di tutti i JEP che saranno inclusi in Java 8 può essere trovato sulla pagina delle milestone di JDK8 .

Lo spazio Permanent Generation (PermGen) è stato completamente rimosso ed è sostituito da un nuovo spazio chiamato Metaspace. Le conseguenze della rimozione di PermGen sono che ovviamente gli argomenti PermSize e MaxPermSize JVM vengono ignorati e non si otterrà mai un java.lang.OutOfMemoryError : errore PermGen. JDK 8 HotSpot JVM ora utilizza la memoria nativa per la rappresentazione dei metadati di class e si chiama Metaspace. Leggi di più >>

Perché lo spazio PermGen è stato rimosso. La gestione della memoria è leggermente cambiata.

http://java.dzone.com/articles/java-8-permgen-metaspace

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

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

La principale differenza tra il vecchio PermGen e il nuovo MetaSpace è che non è necessario definire il limite massimo di utilizzo della memoria. Puoi mantenere illimitato il limite di spazio di MetaSpace. Pertanto, quando l’utilizzo della memoria aumenta, non si ottiene l’errore OutOfMemoryError. Invece la memoria nativa riservata viene aumentata per riempire a pieno l’utilizzo di memoria aumentata.

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

L’implementazione JVM di Oracle per Java 8 ha eliminato il modello PermGen e lo ha sostituito con Metaspace .