2012-03-08 10 views
10

Sto imparando ClassLoader in Java, quindi voglio sapere perché JVM ha molti classloader, perché non solo uno? Il primo caricamento è <Java_Runtime_Home>/lib, quindi carica <Java_Runtime_Home>/lib/ext e l'ultimo caricamento classpath.perché jvm ha molti clasloader? perché non uno?

Se si dispone di un programma di caricamento classi personalizzato, il sistema è il primo.

Qualcuno può dirmi perché JVM ha molti classloader?

risposta

17

Un'applicazione molto utile è quella di poter distribuire diverse applicazioni Web in un singolo server Java EE.

Ogni applicazione può utilizzare versioni diverse delle stesse librerie e deve quindi avere un classloader diverso dagli altri per poter avere versioni diverse delle stesse classi in una JVM singola.

+0

ma il server Web ha il proprio loader.it può avere diversi classloader. – liuxiaori

+0

forse ho konw! Grazie! – liuxiaori

+0

Quindi su una nota non correlata, la singola JVM può avere più istanze di un Singleton ?? Un caricatore per classe? – user1071840

4

Consente di eseguire più applicazioni nella stessa JVM.

Consente inoltre di scaricare porzioni di codice e aggiornarle in un sistema in esecuzione. (Anche se si dispone di una sola applicazione)

Si può trovare questa informazioni su OSGi utili http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html

6

Ci sono molte ragioni per sostenere più di un programma di caricamento classe.

Primo: separazione delle classi. Immagina un server applicazioni. Più progetti indipendenti possono includere le stesse librerie. Se ciascuna applicazione ha il proprio classloader, è possibile caricare versioni diverse senza collisione e i campi statici AFAIK vengono istanziati per ogni programma di caricamento classi.

Secondo: i classloader possono essere sovrascritti per modificare le classi. Un caricatore di classi può migliorare le classi durante il caricamento. Utile per la programmazione orientata all'aspetto (AspectJ) o aggiungendo il codice di debug o di profilazione. Un modo semplice per modificare solo una libreria ma non l'altra è caricarla attraverso diversi classloader.

5

enter image description here I programmi di caricamento classe sono gerarchici e utilizzano un modello di delega durante il caricamento di una classe. I caricatori di classe richiedono al proprio genitore di caricare la classe prima di tentare di caricarla autonomamente. Quando un programma di caricamento classe carica una classe, i caricatori di classe minori nella gerarchia non ricaricheranno mai più la classe. Quindi l'unicità viene mantenuta. Le classi caricate da da un caricatore di classi figlio hanno visibilità sulle classi caricate dai relativi genitori nella gerarchia, ma il contrario non è vero come spiegato nel diagramma precedente.

Problemi correlati