funciona la máquina virtual de JVM



Un cargador de clases

Primer vistazo a la ejecución de programas Java.

                         

A partir de este diagrama es fácil de entender funciona el programa Java en general. En primer lugar, escribir el código de Java, guardarlos en su disco duro. A continuación, se introduce en la línea de comandos

  1. javac YourClassName.java  
javac YourClassName.java

En este punto, el código Java se compila en código de bytes (.class). Si se encuentra en el IDE de Eclipse o otras herramientas de desarrollo, se guarda el código, herramientas de desarrollo tienen que ayudarle a completar el trabajo de compilación anterior, por lo se puede ver los archivos de clase en el directorio correspondiente. En este punto, el archivo de clase aún se guarda en el disco duro, por lo que cuando se ejecuta la línea de comandos

  1. java YourClassName  
java YourClassName

Para completar el trabajo de la caja roja arriba. JRE de cargador lee los archivos de clase desde el disco duro, se carga en el área de memoria del sistema asignada a la JVM - Área de ejecución de datos (tiempo de ejecución Áreas de datos) motor de ejecución de archivos de clase a continuación, interpretado o compilado, la CPU en un código de máquina específica convierte , CPU de la máquina la ejecución de código, completando así todo el proceso.


A continuación, nos centramos en lo que el cargador de clases era exactamente por qué? ¿Cómo es el trabajo?

En primer lugar, un vistazo a algunas de las características de la cargadora, un poco abstracto, pero siempre útil.


"" Jerarquía

cargador de clases se organizan en una jerarquía de relación, es decir, la relación entre padre e hijo. Lo cual, Bootstrap cargador de clases es el padre de todos. Como se muestra a continuación:

        

--Bootstrap cargador de clases:

Cuando se ejecuta la máquina virtual de Java, se crea el cargador de clases, se carga con un poco de API básica de Java, incluyendo la clase Object. Tenga en cuenta que, el cargador de clases no está escrito en Java, pero con C / C ++ para escribir.

cargador de --Extension clase:

Este cargador carga el número de clases a expandirse más allá de la API básica, incluyendo algunos relacionados con el funcionamiento de la seguridad de la clase. (El conocimiento actual no era muy profundo, sólo se puede decir que, en términos generales, que se detalla en una fecha posterior)

--System Cargador de clases:

Se carga las clases de la aplicación, que se configura en la clase de ruta de clases.

--User-Defined Cargador de clases:

Esto es mediante la ampliación de desarrollador definido cargador de clases de cargador de clases personalizada, cargue algunas clases definidas por el programador.


"" Modo Delegado (Modo de Delegación)

Una mirada más cercana a la jerarquía anterior, cuando se carga la JVM una clase, menor será el cargador se les confiará la tarea al cargador de una clase, la carga en el suelo para comprobar si ha sido cargada espacio de nombres de la clase, si tiene cargado, utilizar esta clase directamente. Si no se ha cargado, continuará hasta la parte superior de la comisión. Después de la inspección ha terminado, llevado a cabo en el orden inverso al de carga, si el cargador de arranque no puede encontrar esta clase, la comisión hacia abajo hasta encontrar el archivo de clase. Para un cargador de clases particular, una clase Java sólo puede ser cargado una vez, es decir en la máquina virtual de Java, la clase está llena de identidad (cargador de clases, paquete, className). Ray puede cargarse un cargador de clases diferentes.


Dar un ejemplo concreto para ilustrar, unirse a mí ahora tienen su propia definición de una clase MiClase necesidades se va a cargar, si no se especifica, la cruz-App general (Sistema) cargado. Después de recibir la misión, verificación del sistema si su biblioteca tiene este tipo, que se encuentra a más confiado a la Extensión, Extensión realizar la misma inspección encontró que no continuó hasta la comisión, el más elevado Botas Curry No se encontró a sí mismos, por lo acuerdo a su trayectoria (bibliotecas de clases principales de Java tales como java.lang) intenta cargar, no encontró esta clase MaClass, por lo que tuvo que (la gente como usted, que dan completa, se puede hacer nada, lo tenía a otra persona) a delegado extensión, la extensión en su camino (JAVA_HOME / jre / lib / ext) está buscando, o no se encuentra, continúe hacia abajo, luego Sistema cargador a la ruta ruta de clase buscando, encontrar, y luego se cargan en la máquina virtual de Java.

Supongamos ahora que vamos a poner esta clase JAVA_HOME / jre / lib / ext este camino para ir (equivalente a las cargas del cargador de extensión), de acuerdo con las mismas reglas, y finalmente cargado por el cargador de clase MyClass extensión, ver, la armonización de clase se carga dos veces en el JVM, pero cada vez realizado por diferentes ClassLoader.


"" restricciones de visibilidad

Cuanto menor sea el cargador se puede ver en el cargador de clase alta, y no al revés, es decir único delegado de abajo hacia arriba.


"" No permitir la descarga categoría

cargador de clases puede cargar una clase, pero no puede descargar una clase. Pero el cargador de clases se puede suprimir o creado.


Después de la clase cuando está cargado, JVM continuar con otros trabajos en el siguiente diagrama:


Un diagrama de bloques de varios pasos brevemente como sigue:

Carga: artículos de carga clase descrita anteriormente, la memoria del sistema de archivos Clase cargado a la (área de datos operativos) JVM

Verificación: comprobar si los archivos de clase Java cargados y especificación de la máquina virtual.

Preparación: la memoria para la asignación de la clase requerida, la determinación de una estructura de datos requerida de los atributos y métodos de la clase. (Preparar una estructura de datos que asigna la memoria requerida por las clases e indica los campos, métodos e interfaces definidos en la clase).

Resolver: la piscina constante de clase referencias simbólicas se cambian a la referencia directa. (No entiendo muy bien)

Sus iniciales: inicializan las variables locales asignación de clase para los campos estáticos, mientras se realiza el bloque de inicialización estática.


Así, Cargador de clases carga de clases, lo que se puede hacer para solucionarlo?

Para entender los detalles de las cuales habrá de explicar en detalle el área de datos operativa.


En segundo lugar, el área de datos operativa

Áreas de tiempo de ejecución de datos: Cuando se ejecuta una JVM ejemplo, el sistema le asigna un área de memoria (el tamaño de esta área de memoria se puede configurar), el área de memoria es gestionada por los propios JVM. Separado de una memoria para almacenar un número de datos operativos, como un objeto creado para pasar parámetros a métodos, variables locales, valores de retorno, etc. Señala esta pieza se llama área de datos operativa. Funcionamiento del área de datos se puede dividir en trozos 6: pilas de Java, registro contador de programa (PC registro), pilas de métodos nativos (Native Método Stack), Java heap método del área, el funcionamiento de la piscina constante (constante de tiempo de ejecución piscina). La piscina constante de ejecutar este método debe pertenecen al distrito, pero debido a su importancia, la especificación JVM sea la explicación independiente. Entre ellos, en frente de la 3 (registro de PC, pila Java, pilas de métodos nativos) regional cada hilo es propiedad independiente, los tres últimos son todos los hilos en toda la instancia común JVM. Los seis trozos como se muestra a continuación:


"Contador de PC:

Cada hilo tiene un contador de PC, cuando se crea el flujo arranque (START) contador de PC, el contador se almacena el código de bytes instrucciones (instrucción JVM) que se está ejecutando actualmente dirección.

"Java Pila:

Lo mismo, pila de Java para cada hilo es de propiedad individual, creado cuando el hilo se inicia. El marco de pila se almacena una pila serie (marco de pila), JVM sólo se ajuste a presión (Push) y pop (pop) marco de pila ambos. Cada vez que se llama a un método, JVM salir a la pila presionado en un marco de pila, pop el marco de la pila cuando se devuelven los extremos del método. Si se produce una excepción cuando la ejecución del método, puede llamar printStackTrace otros métodos para ver la pila situación. Una vista esquemática de la pila como sigue:


Aceptar. Ahora vamos a ver los detalles de cada marco de pila se coloca algo. Fácilmente evidentes de la esquemática, cada marco de pila comprende tres partes: un conjunto de variables locales, una pila de operandos, el método pertenece a la constante de clase de referencia de la piscina.

"(Local) matriz local de variables:

Tópica (local) matriz de variables , el orden de salida de 0 a almacenar el método de referencia asociado objeto, parámetros pasados al método, las variables locales. Por ejemplo:

  1. pública vacío  doSomething ( int  a,  doble  b, Object o) {   
  2. ...  
  3. }  
public void doSomething(int a, double b, Object o) {
...
}

RESUMEN marco de pila de este método, las variables locales se almacenan:

  1. 0 este  
  2. 1 : una  
  3. 2 , 3 : b  
  4. 4 : 0  
0: this
1: a
2,3:b
4:0

Mire cuidadosamente qué tipo doble B requiere dos índice consecutivo. Valor cuando el valor de 2 se saca del índice. Para un método estático, la matriz de almacenamiento de esta referencia no es 0, sino que se almacena directamente en los parámetros de transmisión.

"Pila Operando:

Operando tienda pila algún método para la realización de las variables intermedias, JVM prensa-pop o variables cuando la realización del procedimiento. De hecho, la pila de operandos es donde el trabajo real del método, al realizar el método, las variables locales y operando método de intercambio de datos de matriz de pila de acuerdo con la definición. Por ejemplo, se ejecuta el código siguiente, donde la pila de operandos es la siguiente:

  1. int  a =  90 ;  
  2. int  b =  10 ;  
  3. int  c = a + b;  
int a = 90;
int b = 10;
int c = a + b;


Tenga en cuenta que en esta figura, el punto de operando pila 100 se coloca encima del lado superior, de modo que la primera ajuste a presión. Como puede verse, el stack es en realidad un área de almacenamiento temporal de datos para almacenar algunas variables intermedias, el método ha terminado, no habrá ningún ser operando apílelo.

"Pila de referencia de datos de tramas:

Además de una matriz de variables y operandos pila locales, el marco de pila es también una necesidad de piscina constante referencia. Cuando los datos necesarios para llevar a cabo la piscina constante JVM, el acceso es a través de las referencias de la piscina constante. También trama de datos pila enfoque responsable y rendimientos anormales. Si la devolución por el retorno, la trama se extrae del proceso de pila pila de Java. Si el método tiene un valor de retorno, el valor de retorno será empujado en el proceso de la llamada al método de la pila de operandos. Además, los datos almacenados en el método de área pueden además referencias de tabla de excepción. Los siguientes ejemplos se presentan para ilustrar:

  1. clase  Example3C {  
  2.     pública estática vacío  addAndPrint () {    
  3.         doble  resultado = addTwoTypes ( 1 , 88,88 );  
  4.         System.out.println (resultado);  
  5.     }  
  6.     pública estáticos dobles  addTwoTypes ( int  i,  doble  d) {    
  7.     volver  i + d;  
  8.     }  
  9.   
  10. }  
class Example3C{
    public static void addAndPrint(){
        double result = addTwoTypes(1,88.88);
        System.out.println(result);
    }
    public static double addTwoTypes(int i, double d){
    return i+d;
    }

}

Cuando se ejecuta el código, Java pilas como se muestra a continuación:


Tómese el tiempo para estudiar detenidamente el mapa. Como cabe señalar que, en el fondo de la pila, los primeros métodos de la técnica de carga addAndPrint marco de pila, entonces presionan en el método addTwoTypes marco de pila. caracteres más a la derecha en el mapa hay un error, los resultados deben ser almacenados en el operando addTwoTypes pila addAndPrint en.

"pilas" de métodos nativos

Cuando el programa llama al método local (como el código C o C ++) a través de la JNI (Java Native Interface), establecida de acuerdo con el tipo de idioma correspondiente de la pila de métodos nativos.

"" Área de Método

El área de método es una instancia de JVM compartida por todos los hilos de rosca, cuando se inicia una instancia de JVM, se crea el área de método. Es para almacenar funcionamiento de una piscina, el campo y la información constante acerca de los métodos de descarga de código de bytes, variables estáticas, clases y métodos. área diferente JVM implementaciones en el momento de la ejecución será diferente. HotSpot de Oracle llamado espacio permanente (no volátil) o permanentemente sustituyendo (Generación Permanente).

"" Piscina Ejecutar constante

Esta zona y la interfaz de clase de almacenamiento constante, además, lleva a cabo todas las referencias a métodos y campos. Cuando se hace referencia a un método o campo, JVM en encontrar los métodos de direcciones reales y campos en la memoria de esas referencias mediante la ejecución de la piscina constante.

"" Heap (Heap)

Heap se almacena en un objeto o instancia del programa creado. Esta zona de gran influencia en el rendimiento de la máquina virtual Java. Es esta área de proceso de recolección de basura de memoria.

Por lo tanto, el cargador de clase se basa realmente en los archivos de clase compilados, cargar el código de bytes de Java JVM memoria, y los datos operativos completos en la inicialización, motor de ejecución para su ejecución.


En tercer lugar, el motor de ejecución (motor de ejecución)

Después de la clase cargador de código de bytes de carga en la memoria, el motor de ejecución de las instrucciones de código de bytes de Java Con suerte, el código de bytes de Java se lee. El problema es que ahora el código de bytes de Java máquina no se lee, sino que también debe encontrar una forma de código de bytes convertido en la plataforma de código dependiente de la máquina. Este proceso puede ser ejecutado por un intérprete, puede tener tiempo compilador (compilador JIT) para completar.





    
Publicado 11 artículos originales · ganado elogios 2 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/zhengyin_tmac/article/details/52370082
Recomendado
Clasificación