2012-05-21 6 views
5

La mia comprensione è che il PermGen (in un certo senso) contiene il codice di classe in memoria. Spesso abbiamo molti file jar che fanno riferimento al nostro classpath. Quando un file jar è incluso nel classpath (ad esempio nella directory lib di tomcat), tutte le classi di tutti quei jar vengono caricate automaticamente in PermGen?quando le classi in vasi entrano in PermGen

In una domanda simile, una volta che viene utilizzata una classe di un file jar, PermGen carica tutte le classi in quel file jar o solo la classe che viene utilizzata (e quindi carica il resto dei file di classe quando necessario)?

risposta

4

Ciò dipende in una certa misura l'attuazione del programma di caricamento classe e la JVM - l'Java Virtual Machine specification dice questo:

Questa specifica permette una flessibilità di attuazione in merito a quando attività di collegamento (e, a causa della ricorsione, carico) terrà, a condizione che la semantica del linguaggio di programmazione Java sono rispettati, [...]

per esempio, un'implementazione può scegliere di risolvere ogni simbolica di riferimento in una classe o interfaccia individ ually, solo quando viene utilizzato (risoluzione lenta o tardiva) o per risolverli tutti contemporaneamente mentre la classe viene verificata (risoluzione statica). Ciò significa che il processo di risoluzione può continuare, in alcune implementazioni, dopo l'inizializzazione di una classe o di un'interfaccia .

In pratica, nessuna implementazione corretta deve caricare automaticamente tutto in un file JAR solo perché viene caricata una classe nel file, per non parlare del fatto che si trova sul classpath.

0

Solo le classi necessarie sono caricate e memorizzate nello spazio permgen.

0

Il JLS garantisce che una classe sia inizializzata quando - e non prima - è richiesta per la prima volta. L'implementazione è autorizzata ad eseguire il caricamento e il collegamento in precedenza, però.

+0

In realtà la specifica consente esplicitamente le classi di precaricamento. Che una classe debba essere caricata prima che venga usata è abbastanza ovvia. –

+0

E che ne è l'inizializzazione? –

+0

Questa è un'altra questione. Non penso che l'inizializzazione sia rilevante per l'utilizzo di PermGen, anche se suppongo che un'implementazione possa ritardare il caricamento delle classi correlate fino all'inizializzazione. –

2

PermGen è un dettaglio di implementazione di HotSpot e Oracle ha dichiarato di voler sbarazzarsene in futuro [1]. Non fa parte delle specifiche Java (VM). Solo le classi caricate finiscono in PermGen. O esplicitamente attraverso ClassLoader#loadClass o implicitamente attraverso il collegamento. Dovrebbero essere solo le classi utilizzate (e le loro dipendenze) a meno che qualcuno non carichi esplicitamente tutte le classi, ad es. per eseguire la riflessione su di loro. I framework come Spring lo evitano e scansionano invece il codice byte.

Un buon punto di partenza è VisualVM che consente di osservare classi caricate su PermGen.

[1] JRockit non ha PermGen e nelle recenti versioni di HotSpot il pool interno di stringhe non è più in PermGen.

+1

Vale la pena notare che solo gli oggetti java.lang.Class, alcuni degli oggetti java.lang.String associati al nome della classe e i nomi dei metodi e gli oggetti statici a cui fa riferimento la Classe verranno caricati in PermGen. Non è come se il tuo bytecode venisse caricato lì o qualcosa ... –

Problemi correlati