Cosa fa -XX: MaxPermSize?


260

In particolare, perché dovrebbe aiutare a risolvere un problema con PermGen OutOfMemoryError?

Inoltre, punti bonus per una risposta che mi punta alla documentazione sugli argomenti JVM ...



6
oracle.com/technetwork/java/javase/tech/… Come mi darai questi punti bonus ora? :)
Denys Séguret,

1
@PaulTomblin Non sono sicuro che il ragazzo a cui stai collegando l'articolo (il primo risultato di Google) abbia idea di cosa stia parlando.
Denys Séguret,

@dystroy Potrei inviarti un cookie? Oppure potresti semplicemente accontentarti di una domanda a cui è stata data una risposta;)
Geoff,

5
Questo non risponde specificamente alla domanda, ma se stai guardando la gestione della memoria JVM, i migliori articoli che ho letto su questo sono questo e questo link infoq
Abe

Risposte:


274

Lo spazio permanente è il luogo in cui le classi, i metodi, le stringhe interiorizzate e oggetti simili utilizzati dalla VM sono archiviati e mai deallocati (da qui il nome).

Questo articolo Oracle presenta in modo succinto il funzionamento e la parametrizzazione di HotSpot GC e ti consiglia di aumentare questo spazio se carichi molte classi (questo è in genere il caso dei server delle applicazioni e di alcuni IDE come Eclipse):

La generazione permanente non ha un impatto evidente sulle prestazioni del Garbage Collector per la maggior parte delle applicazioni. Tuttavia, alcune applicazioni generano e caricano dinamicamente molte classi; ad esempio, alcune implementazioni delle pagine JSP (JavaServer Pages). Queste applicazioni potrebbero richiedere una generazione permanente più ampia per contenere le classi aggiuntive. In tal caso, la dimensione massima di generazione permanente può essere aumentata con l'opzione della riga di comando -XX: MaxPermSize =.

Si noti che questa altra documentazione di Oracle elenca gli altri argomenti di HotSpot.

Aggiornamento: a partire da Java 8, sia lo spazio permgen che questa impostazione sono spariti. Il modello di memoria utilizzato per le classi e i metodi caricati è diverso e non è limitato (con impostazioni predefinite). Non dovresti più vedere questo errore.


93

-XX:PermSize -XX:MaxPermSize vengono utilizzati per impostare le dimensioni per la generazione permanente.

Generazione permanente: la generazione permanente è dove vengono conservati i file di classe. Questi sono il risultato di classi compilate e pagine JSP. Se questo spazio è pieno, attiva una Garbage Collection completa. Se la Garbage Collection completa non è in grado di ripulire le vecchie classi non referenziate e non c'è spazio per espandere lo spazio permanente, viene generato un errore di memoria insufficiente (OOME) e la JVM si arresta in modo anomalo.


48

In Java 8 quel parametro viene comunemente utilizzato per stampare un messaggio di avviso come questo:

Avviso VM server Java HotSpot (TM) a 64 bit: ignorando l'opzione MaxPermSize = 512m; il supporto è stato rimosso in 8.0

Il motivo per cui ricevi questo messaggio in Java 8 è perché Permgen è stato sostituito da Metaspace per affrontare alcuni degli svantaggi di PermGen (come hai potuto vedere da solo, uno di quegli svantaggi è che aveva una dimensione fissa).

Cordiali saluti: un articolo su Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html


6
Vedi anche: Eliminazione di PermGen in JDK 8 (stackoverflow).
sarà il
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.