2012-01-19 16 views
10
  • Tenía curiosidad acerca de qué todas las ubicaciones JVM busca para ejecutar un programa? Estoy más interesado en comprender en qué secuencia y dónde busca JVM los archivos de clase, como si mirase en libs de java, libs de extensión, classpath, cualquier directorio como el directorio actual desde el que se invoca Java. Estoy más interesado en el comportamiento de JVM y no en la clase de carga del cargador de clases, que sé que tiene mecanismo de delegación de padres hasta la raíz.¿Cómo comienza JVM a buscar clases?

  • Si se ejecuta una clase desde un directorio donde la clase compilada se guarda en el sistema de archivos y también en un archivo jar en el mismo directorio, ¿JVM cargaría ambos o solo uno y cuál?

  • Digamos que tiene un hilo inseguro Vector y si lo comparamos con el rendimiento ArrayList, ¿cuál sería mejor y por qué?

+8

¿Cuál de estos puntos no pertenece? –

+0

La tercera viñeta probablemente debería considerarse por separado. Los primeros 2 están relacionados y coinciden con el título de su pregunta. Tercero no. – rfeak

+0

Me ocuparé de esto la próxima vez @rfeak –

Respuesta

7

Cómo se encuentran las clases. respuesta está aquí:

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/findingclasses.html

respuesta para el punto 2: Orden de búsqueda de clases es el siguiente:

  1. clases o paquetes en el directorio actual.
  2. clases encontradas en la variable de entorno CLASSPATH. [reemplaza 1]
  3. clases encontradas desde la opción de línea de comando classpath. [1,2] anula
  4. clases encontradas de los archivos jar especificados mediante la opción de línea de comandos-jar [1,2,3] anulaciones

tanto, si utiliza la opción -jar mientras se ejecuta, clases provienen de jarfile.

Sin embargo, solo se carga una clase.

+0

Aquí no se recomiendan las respuestas basadas en enlaces. – RanRag

+0

Gracias @Rajendran T, point2: digamos que no estamos especificando ninguna ruta de clase, ¿qué ocurre en ese caso? ¿JVM cargará ambos o solo uno de ellos, entonces cuál? –

+0

@Taran si no establece el classpath en el entorno (punto2) o en la línea de comando (punto 3), entonces el classpath predeterminado incluye solo el directorio de trabajo actual. – Dev

1
  1. Creo que Java se ve en el directorio actual, luego en la ruta de clase, según el argumento de la VM "-cp". Puede poner cualquier combinación de carpetas de clases (por ejemplo,/project/bin/com/putable), archivos de clase específicos (por ejemplo, /project/bin/com/putable/MyClass.class) y archivos JAR (por ejemplo,/project/lib/MyJar.jar) en la ruta de clase. Las ubicaciones están separadas por dos puntos (sistemas operativos basados ​​en Unix) o punto y coma (sistemas operativos basados ​​en Windows). Entonces, cualquier cosa en el classpath es un juego justo para que Java lo mire al obtener definiciones de clases. Con respecto a la secuencia, las clases se cargan perezosamente. Por lo tanto, solo se cargan cuando la aplicación los requiere por primera vez. Si su aplicación no requiere una cierta clase durante la duración de su tiempo de ejecución, esa clase NUNCA se cargará.

  2. Si no pone nada en la ruta de clase, creo que Java se cargará desde el archivo de clase y no desde el Jar. Si especifica uno u otro en el classpath, entonces ese es el lugar que buscará Java. Si coloca ambos en classpath, el comportamiento de carga de clases de Java no está definido y podría elegir cualquiera, dependiendo de la implementación de JVM.

  3. Depende de lo que quieras hacer. Los vectores en realidad siempre son seguros para subprocesos, según la API de Java, por lo que si no necesita acceso simultáneo, ArrayList será más rápido. Los vectores y ArrayLists están respaldados por matrices, pero aumentan la capacidad a diferentes velocidades (la capacidad del vector se duplica cada vez que se llega al final y se necesita más espacio, pero ArrayList aumenta en un 50%).Dependiendo de la frecuencia con que crezca o se reduzca, la respuesta variará. Echa un vistazo a este enlace para más información:

http://www.javaworld.com/javaworld/javaqa/2001-06/03-qa-0622-vector.html

6

Sin usar cualquier cargador de clases adicionales:

  • orden de búsqueda de una JVM:
    1. clases de tiempo de ejecución (básicamente, rt.jar en $JRE_HOME/lib `)
    2. Clases de extensión (algunos JAR en $JRE_HOME/lib/ext`)
    3. Classpath, en orden. Hay cuatro posibilidades para especificar classpath:
      1. Si se especificó -jar, entonces ese JAR está en el classpath. Cualquier classpath que se declare como classpath en META-INF/MANIFEST.MF también se considera.
      2. De lo contrario, si se especificó -cp, ese es el classpath.
      3. De lo contrario, si $CLASSPATH está configurado, ese es el classpath.
      4. De lo contrario, el directorio actual desde el que se ha iniciado java es classpath.
      lo tanto, si especifico -cp src/A.jar:src/B.jar, entonces A.jar se buscará en primer lugar, a continuación, B.jar
  • Las cargas de JVM sólo la clase que se encuentra en primer lugar, de acuerdo con el orden en que los directorios/archivos JAR se declaran en la classpath. Esto es importante si usa -cp o $CLASSPATH.
  • En escenarios de hilos individuales y con las JVM recientes, Vector y ArrayList debería tener un rendimiento similar (ArrayList debe realizar un poco mejor, ya que no es synchronized, pero de bloqueo es rápido actualmente, cuando no existe contención, por lo que la diferencia debe ser pequeña) De todos modos, Vector está obsoleto: no lo use en el nuevo código.
1

Estoy más interesado en el comportamiento JVM y no cómo la clase carga cargador clase

Lo sentimos, pero esto no tiene sentido. Porque la respuesta es que la JVM crea un cargador de clases y permite que este cargador de clases cargue las clases. Entonces, para comprender el "comportamiento de JVM", necesita comprender el comportamiento del cargador de clases.

Pero tal vez su pregunta era: ¿cómo crea la JVM el cargador de clases del sistema?

+0

Esto es más un comentario que una respuesta. – cHao

0

Primero, de forma predeterminada, el sistema de tiempo de ejecución de Java usa el directorio de trabajo actual como punto de partida. Por lo tanto, si su paquete está en un subdirectorio del directorio actual , se encontrará. En segundo lugar, puede especificar una ruta de directorio o rutas estableciendo la variable de entorno CLASSPATH . En tercer lugar, puede usar la opción -classpath con java y javac para especificar la ruta a sus clases.
Por ejemplo, considere la siguiente especificación de paquete:

paquete MyPack;

Para que un programa encuentre MyPack, una de las tres cosas debe ser cierta. El programa se puede ejecutar desde un directorio inmediatamente arriba de MyPack, o CLASSPATH debe ser configurado para incluir la ruta a MyPack, o la opción -classpath debe especificar la ruta a MyPack cuando el programa se ejecuta a través de java. Cuando se utilizan las segundas dos opciones, la ruta de clase no debe incluir MyPack. Es debe simplemente especificar la ruta a MyPack. Por ejemplo, en un entorno Windows, si la ruta a MyPack es

C: \ MyPrograms \ Java \ MyPack

entonces la ruta de clase a MyPack es

C: \ MyPrograms \ Java

La forma más fácil intente con los ejemplos que se muestran para crear los directorios del paquete debajo de su directorio de desarrollo actual, coloque los archivos .class en los directorios apropiados y luego ejecútelos desde el directorio de desarrollo. Este es el enfoque utilizado en el siguiente ejemplo.