2012-06-11 9 views
8

He leído tantas Q & Una aquí acerca de las herramientas disponibles para averiguar sin usar JAR, tales como:Impactos de tener archivos JAR utilizados en CLASSPATH

  1. loosejar
  2. Classpath Helper

Mi pregunta aquí es, ¿hay algún impacto (como la carga de clases en la memoria, el rendimiento, etc.) de tener JAR no utilizados en el classpath en tiempo de compilación o tiempo de ejecución? La pregunta se aplica tanto a la ejecución como un programa independiente y servidor web (Apache Tomcat), aunque inicialmente pensé solo en programas autónomos.

NOTA: Estoy ejecutando JDK 6u32 (64 bits).

Respuesta

8

¿Hay algún impacto (como la carga de clases en la memoria, el rendimiento, etc.) de tener JAR no utilizados en el classpath en tiempo de compilación o tiempo de ejecución?

Va a haber un pequeño impacto. Cuando se inicia el cargador de clases (o el equivalente del compilador), tiene que leer el índice de cada archivo JAR para descubrir qué clases hay en cada JAR. Si tiene JAR innecesarios en el classpath, el cargador de clases tiene más trabajo por hacer, y usará (al menos temporalmente) más memoria para almacenar en caché los índices.

Esto se aplica a todo tipo de aplicaciones Java.

La pregunta que no hizo es si el impacto es significativo. La respuesta es "generalmente no" ... pero mientras más "cosas inútiles" tenga en la ruta de clase, mayor será el impacto.

+0

¿Para que * impacto pequeño * sea aplicable tanto en tiempo de compilación como en tiempo de ejecución? – Gnanam

+0

Sí ... en ambos casos. Y por lo general no vale la pena preocuparse en ninguno de los casos. –

0

Sí, tiene un impacto, porque la JVM busca las clases necesarias en los JAR de CLASSPATH. También tiene sentido mantener los JAR sellados, para decirle a la JVM que no busque clases relacionadas en otras JAR.

P.S .: javac es también un programa de Java, para el registro.

+0

Sin embargo, el almacenamiento en caché de los índices de archivo JAR significa que la sobrecarga de buscar en lugares adicionales es mínima. –

3

El problema principal no es el rendimiento, ya que el costo es relativamente pequeño y solo al cargar nuevas clases. El problema principal es la mantenibilidad. Por ejemplo, cuando una biblioteca necesita ser actualizada, puede perder mucho tiempo probando que la aplicación todavía funciona bien con la nueva versión solo para encontrar que la biblioteca no fue utilizada. (Digamos que tiene una nueva biblioteca que necesita una versión más nueva de una biblioteca que ya está "usando")

+0

No pude entender claramente este punto: 'cuando una biblioteca necesita ser actualizada, puede perder mucho tiempo probando que la aplicación todavía funciona bien con la nueva versión solo para descubrir que la biblioteca no se utilizó'. ¿Puedes aclarar sobre esto? – Gnanam

+1

Supongamos que tiene log4j versión 1.1, pero desea utilizar la biblioteca X que necesita log4j 1.2 por alguna razón. No puede simplemente ingresar la versión 1.2 hasta que determine que no interrumpe su aplicación. Entonces vuelve a probar su aplicación usando 1.2 para ver si todavía funciona y pierde mucho tiempo porque ni siquiera está usando log4j. Si solo tiene bibliotecas que está usando, esto no sería un problema. –

Cuestiones relacionadas