2012-08-24 39 views
189

In particolare, perché potrebbe aiutare a risolvere un problema PermGen OutOfMemoryError?Cosa fa -XX: MaxPermSize fare?

Inoltre, punti bonus per una risposta che mi indica la documentazione sugli argomenti JVM ...

+0

http://mark.koli.ch/2009/01/understanding-javas-perm-gen-maxpermsize-heap-space-etc.html –

+5

http://www.oracle.com/technetwork/java/javase /tech/vmoptions-jsp-140102.html Come mi darai quei punti bonus adesso?:) –

+1

@PaulTomblin Non sono sicuro che il tipo a cui stai collegando il tuo articolo (il primo risultato di Google) abbia qualche idea di cosa stia parlando. –

risposta

207

Lo spazio permanente è dove le classi, i metodi, le stringhe interiorizzate, e simili oggetti utilizzati dal VM vengono memorizzati e mai deallocato (da cui il nome).

This Oracle article presenta sinteticamente il funzionamento e la parametrizzazione del HotSpot GC e vi consiglia di aumentare questo spazio se si carica molte classi (questo è in genere il caso per i server applicazioni e alcuni IDE come Eclipse):

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

Nota che this other Oracle documentation elenca gli altri argomenti di HotSpot.

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

75

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

Generazione permanente: la generazione permanente è il luogo in cui vengono conservati i file di classe. Questi sono il risultato di classi compilate e pagine jsp. Se questo spazio è pieno, attiva una raccolta completa di rifiuti. Se la Full Garbage Collection non può eliminare vecchie classi non referenziate e non c'è più spazio per espandere lo spazio permanente, viene generato un errore di memoria insufficiente (OOME) e la JVM si arresta in modo anomalo.

+9

+1 per gli errori specifici e la cronologia di ciò che accade. – Tony

35

In Java 8 che il parametro è comunemente utilizzato per stampare un messaggio di avviso come questo:

Java HotSpot (TM) di avvertimento VM 64-bit di server: opzione ignorando MaxPermSize = 512m; il supporto è stato rimosso in 8,0

Il motivo per cui si ottiene questo messaggio in Java 8 è perché PermGen è stato sostituito da Metaspace per affrontare alcune delle svantaggi di PermGen (come lo siete stati in grado di vedere di persona, uno di questi inconvenienti è che aveva una dimensione fissa).

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

+2

Vedere anche: [Eliminazione permGen in JDK 8] (http://stackoverflow.com/questions/18339707/permgen-elimination-in-jdk-8) (stackoverflow). – will

1

Il MaxPermSize è la dimensione massima per il mucchio permanente generazione, un mucchio che contiene il codice di byte di classi e viene mantenuto separato dal mucchio oggetto che contiene le istanze reali.