2012-06-11 21 views
8

che ho letto così tante Q & A qui sugli strumenti disponibili a scoprire inutilizzati JAR, come ad esempio:impatti di avere file JAR non utilizzati nel classpath

  1. loosejar
  2. Classpath Helper

La mia domanda qui è, ci sono impatti (come il caricamento di classi in memoria, prestazioni, ecc.) Di avere JAR inutilizzati nel classpath in fase di compilazione o di esecuzione? La domanda vale sia per l'esecuzione come programma autonomo e Web Server (Apache Tomcat), anche se inizialmente pensavo solo ai programmi standalone.

NOTA: Sono in esecuzione JDK 6u32 (64 bit).

risposta

8

Ci sono impatti (come il caricamento di classi in memoria, prestazioni, ecc.) Di avere JAR inutilizzati nel classpath in fase di compilazione o di esecuzione?

Ci sarà un piccolo impatto. Quando il caricatore di classi (o l'equivalente del compilatore) si avvia, deve leggere l'indice di ogni file JAR per scoprire quali sono le classi in ogni JAR. Se hai JAR non necessari sul classpath, il classloader ha più lavoro da fare e (almeno temporaneamente) userà più memoria per memorizzare nella cache gli indici.

Questo vale per tutti i tipi di applicazioni Java.

La domanda che non è stata posta è se l'impatto è significativo. La risposta è "generalmente no" ... ma più "roba inutile" si ha sul classpath, maggiore sarà l'impatto.

+0

Quindi * l'impatto ridotto * è applicabile sia al momento della compilazione che al tempo di esecuzione? – Gnanam

+0

Sì ... in entrambi i casi. E di solito non vale la pena preoccuparsi in entrambi i casi. –

0

Sì, ha un impatto, perché la JVM cerca le classi necessarie nei JAR del CLASSPATH. Ha anche senso tenere i JAR sigillati, per dire alla JVM di non cercare classi correlate in altri JAR.

P.S .: javac è anche un programma java, per la cronaca.

+0

Tuttavia, la memorizzazione nella cache degli indici di file JAR significa che il sovraccarico di ricerca in posti aggiuntivi è minimo. –

3

Il problema principale non è la prestazione poiché il costo è relativamente piccolo e solo sul caricamento di nuove classi. Il problema principale è la manutenibilità. Ad esempio, quando è necessario aggiornare una libreria, è possibile perdere un sacco di tempo per testare che l'applicazione funziona ancora correttamente con la nuova versione solo per trovare la libreria non utilizzata. (Supponiamo che tu abbia una nuova libreria che necessita di una versione più recente di una libreria che stai già "usando")

+0

Non ho capito bene questo punto: "quando una libreria deve essere aggiornata, si può perdere un sacco di tempo per testare che l'applicazione funziona ancora correttamente con la nuova versione solo per trovare la libreria non utilizzata". Puoi chiarire questo? – Gnanam

+1

Supponiamo di avere la versione 1.1 di log4j, ma si desidera utilizzare la libreria X che ha bisogno di log4j 1.2 per qualche motivo. Non è sufficiente rilasciare la versione 1.2 finché non si determina che non si interrompe l'applicazione. Quindi ripeti la tua richiesta usando 1.2 per vedere se funziona ancora e spreca un sacco di tempo perché non stai nemmeno usando log4j. Se hai solo librerie che stai usando, questo non sarebbe un problema. –

Problemi correlati