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 ...
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 ...
Risposte:
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.
-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.
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