Cosa significa effettivamente PermGen?


122

So cos'è PermGen, a cosa serve, perché fallisce, come aumentarlo ecc.

Quello che non so è cosa significa effettivamente PermGen. Permanente ... Gen ... qualcosa?

Qualcuno sa cosa significa effettivamente PermGen?


1
[Buona descrizione] [1] dal ragazzo che sa molto sugli interni di GC. A proposito, nel suo blog ci sono molte informazioni utili relative a GC. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov

Risposte:


84

Generazione permanente. I dettagli sono ovviamente specifici dell'implementazione.

In breve, contiene gli oggetti Java associati alle classi e alle stringhe internate. Nell'implementazione client di Sun con condivisione attiva, la classes.jsamemoria è mappata per formare i dati iniziali, con circa metà di sola lettura e metà di copia su scrittura.

Gli oggetti Java che sono semplicemente vecchi vengono conservati nella Tenured Generation.


19
"In JDK 7, le stringhe internate non sono più allocate nella generazione permanente dell'heap Java": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi

30
E in JDK 8 non esiste alcuna generazione permanente! È divertente vedere questa risposta evolversi nel corso degli anni.
Brian Gordon

3
@BrianGordon è corretto .. Per ulteriori informazioni a riguardo: stackoverflow.com/a/22509753/4557537
Fadi

59

PermGen viene utilizzato dalla JVM per conservare le classi caricate. Puoi aumentarlo usando:

-XX:MaxPermSize=384m

se stai usando Sun JVM o OpenJDK.

Quindi, se ottieni un'eccezione OutOfMemoryException: PermGen, devi ingrandire PermGen o potresti avere problemi con il caricatore di classi.


6
Quale risposta era quella accettata nel momento in cui hai pubblicato questo commento? La risposta attualmente accettata ( questa , di "Tom Hawtin - tackline") mi sembra accurata. Potrebbe avere senso modificare il tuo commento in modo che non induca le persone a diffidare della risposta attualmente accettata?
jbyler


8

Corrispondenza non propriamente correlata alla domanda originale, ma qualcuno potrebbe trovarla utile. PermGen è davvero un'area della memoria dove Java era solito mantenere le sue classi. Quindi, molti di noi si sono imbattuti in OOM in PermGen, se ci fossero, ad esempio, molte classi.

A partire da Java 8, l'area PermGen è stata sostituita dall'area MetaSpace, che è più efficiente ed è illimitata per impostazione predefinita (o più precisamente - limitata dalla quantità di memoria nativa, a seconda della jvm a 32 o 64 bit e della disponibilità della memoria virtuale del sistema operativo). Tuttavia è possibile regolarlo in alcuni modi, ad esempio specificando un limite massimo per l'area. Puoi trovare informazioni più utili in questo post del blog .




3

Se non ricordo male, gen sta per generazione, come in un garbage collector generazionale (che tratta gli oggetti più giovani in modo diverso dagli oggetti di mezza età e "permanenti"). Il principio della località suggerisce che gli oggetti creati di recente verranno eliminati per primi.


1

Permgen sta per generazione permanente. È una delle aree di memoria JVM. Fa parte di Heap con dimensioni fisse utilizzando un flag chiamato MaxPermSize.

Perché il nome "PermGen"?

Questo permgen è stato chiamato nei primi giorni di Java. Permgen mains conserva tutti i metadati delle classi caricate. Ma il problema è che una volta caricata una classe, rimarrà nella JVM fino all'arresto della JVM. Quindi il nome permgen è optare per quello. Ma in seguito, è entrato in scena il caricamento dinamico delle classi ma il nome non è stato modificato. Ma con Java 8 , hanno risolto anche questo problema. Ora permagen è stato rinominato MetaSpace con dimensioni di memoria dinamiche.

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.