2010-01-07 18 views
12

Supongamos que tengo 500 archivos jar vinculados a mi programa que suman más de 500 MB (tamaño de todos los archivos jar, no de cada uno) y mi programa realiza una llamada a una clase ubicada en uno de ellos. ¿Cómo busca Java a través de jar para una clase, y cuál es la eficiencia de esto? En)? O (log (n))?¿Cómo busca Java eficientemente los archivos jar para las clases?

Respuesta

10

Java busca en la estructura de directorios internos del contenedor una coincidencia exacta con el nombre completo. Parece; no busca Si tiene 500 archivos jar en classpath, Java los buscará uno por uno en el orden especificado hasta que encuentre una coincidencia. Si el jar que contiene una clase determinada es el último, Java buscará en los 500 archivos jar. Así que supongo que es O (n).

ACTUALIZACIÓN: El comportamiento descrito anteriormente es el comportamiento predeterminado. Sin embargo, como Hassan señaló, esto se puede optimizar proporcionando un JarIndex en el archivo jar raíz que permite al cargador de clases encontrar el archivo jar apropiado con una búsqueda simple en un nombre de paquete.

+0

En Java 7, están intentando canjear eso al admitir un sistema de módulo, similar a OSGi – notnoop

+0

(-1) que la información está desactualizada. –

+1

@Hassan. Los índices son opcionales, el valor predeterminado es de hecho lineal: el nuevo esquema de carga de clases es totalmente retrocompatible con las aplicaciones desarrolladas sobre el mecanismo de extensión actual. Cuando el cargador de clases carga el primer archivo jar y se encuentra un archivo INDEX.LIST en el directorio META-INF, construirá la tabla de índice de hash y usará el nuevo esquema de carga para la extensión. De lo contrario, el cargador de clases simplemente usará el algoritmo de búsqueda lineal original. – djna

7

De manera predeterminada solía ser lineal; sin embargo, desde JDK 1.3, se puede incrustar un índice JAR en el primer archivo JAR de una aplicación.

Esto significa que si el índice está incrustado en el archivo JAR, el cargador de clases puede encontrar de manera eficiente todas las clases distribuidas en múltiples archivos JAR que pertenecen a la aplicación.

enlace a SUN Resource en JAR Indexing. Nota: los recursos que no son de clase no parecen estar cubiertos.

+0

¿Cree que el uso de índices es común? Creo que aún el comportamiento lineal es el predeterminado, necesita agregar un índice y mucha gente no. – djna

+0

Todas las cremalleras tienen un índice al final del archivo de todos modos, por lo que no hace mucha diferencia. –

+0

hmm, Parece que ANT predetermina http://ant.apache.org/manual/CoreTasks/jar.html a falso para la generación de índices en archivos JAR. Me pregunto qué hacen los IDE. –

Cuestiones relacionadas