Cos'è lo spazio permanente?


88

Mentre imparo a conoscere il profilo della memoria Java, continuo a vedere il termine "spazio permanente" oltre a "heap". So cos'è l'heap - cos'è lo spazio permanente?


13
Java 8 ha completamente rimosso questo concetto e si è trasferito in Metaspace
pramodc84

2
Riferimento spiegato bene qui youtube.com/watch?v=PUUJ4rNpRhU
shareef

Risposte:


103

Sta per generazione permanente :

La generazione permanente è speciale perché contiene metadati che descrivono le classi utente (classi che non fanno parte del linguaggio Java). Esempi di tali metadati sono oggetti che descrivono classi e metodi e sono memorizzati nella generazione permanente. Le applicazioni con una grande base di codice possono riempire rapidamente questo segmento dell'heap che causerà java.lang.OutOfMemoryError: PermGen non importa quanto sia alto il tuo -Xmx e quanta memoria hai sulla macchina.


Andrew, sono solo curioso di sapere quale potrebbe essere la dimensione di PerGen?
gks

Sono solo curioso se permgen è una parte della memoria heap (come affermato in questa risposta) o è off-heap (come affermato in questa risposta - stackoverflow.com/a/31103100/3061686 ).
akki

25

Perm spaceviene utilizzato per mantenere le informazioni per le classi caricate e poche altre funzionalità avanzate come String Pool(per test di uguaglianza delle stringhe altamente ottimizzate), che di solito vengono create dai String.intern()metodi. Man mano che la tua applicazione (numero di classi) crescerà, questo spazio verrà riempito rapidamente, poiché la garbage collection su questo spazio non è molto efficace da pulire come richiesto, ottieni rapidamente Out of Memory: perm gen space error. Dopodiché, nessuna applicazione verrà eseguita su quella macchina in modo efficace anche dopo avere un'enorme JVM vuota.

Prima di avviare la tua applicazione dovresti java -XX:MaxPermSizeeliminare questo errore.


Il pool di stringhe viene spostato nello spazio dell'heap da java 7.
Caffeine Coder

20

Risposta semplice (ed estremamente semplificata): è dove la jvm memorizza i propri dati di contabilità, al contrario dei tuoi dati.


17

Perm Gen sta per generazione permanente che contiene le informazioni sui metadati sulle classi.

  1. Supponiamo che se crei un nome di classe A, la sua variabile di istanza verrà archiviata nella memoria heap e la classe A insieme ai classloader statici verrà archiviata in generazione permanente.
  2. I garbage collector troveranno difficile cancellare o liberare lo spazio di memoria immagazzinato nella memoria di generazione permanente. Quindi è sempre consigliabile mantenere le impostazioni di memoria permgen al limite consigliabile.
  3. JAVA8 ha introdotto il concetto chiamato generazione di meta-spazio, quindi permgen non è più necessario quando si utilizzano le versioni jdk 1.8.

5

Lo spazio permgen è l'area dell'heap che contiene tutti i dati riflettenti della macchina virtuale stessa, come gli oggetti classe e metodo.


3

Contiene cose come definizioni di classi, pool di stringhe, ecc. Immagino che potresti chiamarlo meta-dati.


3

Lo spazio permgen è sempre noto come area del metodo. Quando il sottosistema del caricatore di classi caricherà il file di classe (codice byte) nell'area del metodo (permGen). Contiene tutti i metadati della classe, ad esempio: nome completo della classe, nome completo della classe genitore immediata, informazioni sulla variabile, informazioni sul costruttore, informazioni sul pool costante ecc.


2

Cosa esiste sotto PremGen: Class Area rientra nell'area PremGen. I campi statici vengono sviluppati anche durante il caricamento della classe, quindi esistono anche in PremGen. L'area Constant Pool con tutti i campi immutabili raggruppati come String viene mantenuta qui. In aggiunta a ciò, si trovano anche i dati di classe caricati dai caricatori di classi, gli array di oggetti, gli oggetti interni usati da jvm.


1

PermGen Space sta per allocazione di memoria per generazione permanente Tutti gli oggetti immutabili Java rientrano in questa categoria, come quello Stringcreato con valori letterali o con String.intern()metodi e per caricare le classi in memoria. PermGen Space accelera la nostra ricerca sull'uguaglianza delle stringhe.


1
  • JVM ha una rappresentazione interna degli oggetti Java e quelle rappresentazioni interne sono memorizzate nell'heap (nella generazione giovane o nella generazione di ruolo).
  • JVM ha anche una rappresentazione interna delle classi Java e queste sono memorizzate nella generazione permanente

inserisci qui la descrizione dell'immagine

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.