2009-10-27 14 views
59

stavo attraversando il documento in Java Memory Management e che mi sono imbattuto PermSize che non riuscivo a capire. Il documento dice che memorizza, "JVM memorizza i suoi metadati", ma non ho potuto ottenere esattamente cosa si intende per metadati. Stavo cercando su google e da qualche parte leggevo un oggetto valore (oggetto definito dall'utente).Che cosa è "PermSize" in Java?

Che tipo di oggetti sono memorizzati lì? Un esempio con una spiegazione sarebbe grandioso.

+0

Il valore predefinito è 64 m per le macchine virtuali a 64 bit. Lo abbiamo aumentato a '512m' per un server tomcat con 8 app per binari.'-XX: MaxPermSize = 512m -XX: PermSize = 512m'. Tomcat con molte definizioni di classe stessa ha bisogno di un grande PerSize e con rubino, rubino su rotaia combinato con jruby .. ha bisogno di un enorme PermSize. –

+2

Si noti che la generazione permanente (e con essa i parametri PermSize) stanno andando via in Java 8. Sono sostituiti dal "Metaspace". Vedi http://javaeesupportpatterns.blogspot.co.uk/2013/02/java-8-from-permgen-to-metaspace.html – sleske

risposta

100

Una rapida definizione del "generazione permanente":

"La generazione permanente è utilizzato per tenere dati riflettenti della stessa VM come oggetti di classe e metodo oggetti Questi oggetti riflettenti sono . allocato direttamente nella permanente generazione, ed è dimensionato indipendentemente dagli altri generazioni." [ref]

In altre parole, questo è dove le definizioni di classe vanno (e questo spiega il motivo per cui si può ottenere il messaggio OutOfMemoryError: PermGen space se un'applicazione carica un gran numero di classi e/o sulla ridistribuzione).

Nota che PermSize è addizionale al valore -Xmx impostato dall'utente sulle opzioni JVM. Ma MaxPermSize consente alla JVM di aumentare lo PermSize all'importo specificato. Inizialmente quando viene caricata la VM, MaxPermSize sarà ancora il valore predefinito (32mb per -client e 64mb per -server) ma in realtà non occuperà tale importo finché non sarà necessario. D'altra parte, se si dovesse impostare sia PermSize e MaxPermSize a 256MB, si nota che il cumulo complessiva è aumentata di 256 MB aggiuntivi per l'impostazione -Xmx.

9

Il pool di permamenti contiene tutto ciò che non è i dati dell'applicazione, ma piuttosto le cose necessarie per la VM: in genere contiene stringhe internate, il codice byte di classi definite, ma anche altri "non tuoi" pezzi di dati.

22

This blog post dà una bella spiegazione e alcuni retroscena. Fondamentalmente, la "generazione permanente" (la cui dimensione è data da PermSize) è usata per immagazzinare cose che la JVM deve allocare per lo spazio, ma che non saranno (normalmente) raccolte con garbage (quindi "permanenti") (+). Ciò significa ad esempio classi caricate e campi statici.

C'è anche un FAQ on garbage collection direttamente dal Sole, che risponde ad alcune domande circa la generazione permanente. Infine, ecco uno blog post con molti dettagli tecnici.

(+) Attualmente le parti della generazione permanente saranno GCed, ad es. gli oggetti di classe verranno rimossi quando una classe viene scaricata. Ma era raro che la generazione permanente fosse introdotta nella JVM, da cui il nome.