¿Qué puede hacer exactamente un teléfono compatible con Java?
Autor: Xuechao Liu
1 Tecnología Java y máquina virtual Java
Cuando se trata de Java, la primera Lo que la gente piensa es la máquina virtual Java: Liu Xuechao
1 Tecnología Java y máquina virtual Java
Cuando se trata de Java, la gente primero piensa en el lenguaje de programación Java, pero en De hecho, Java es una tecnología compuesta por cuatro aspectos: lenguaje de programación Java, formato de archivo de clase Java, máquina virtual Java e interfaz de programación de aplicaciones Java (API Java). La relación entre ellos se muestra en la siguiente figura:
Figura 1 La relación entre los cuatro aspectos de Java
El entorno de ejecución representa la plataforma Java, donde los desarrolladores escriben código Java (. archivo java) y luego compílelo en código de bytes (archivo .class). Finalmente, el código de bytes se carga en la memoria. Una vez que el código de bytes ingresa a la máquina virtual, un intérprete lo interpreta y ejecuta o, opcionalmente, lo convierte a código de máquina para su ejecución mediante un generador de código inmediato. Como se puede ver en la figura anterior, la plataforma Java está construida por la máquina virtual Java y la interfaz de programación de aplicaciones Java es la entrada a esta plataforma. Los programas escritos y compilados en el lenguaje Java se pueden ejecutar en esta plataforma. La estructura de esta plataforma se muestra en la siguiente figura:
En la estructura de la plataforma Java, puede ver que la Máquina Virtual Java (JVM) es el núcleo y es la clave para que el programa se ejecute. independiente del sistema operativo y del hardware subyacentes. Debajo está la interfaz de portabilidad, que consta de dos partes: el adaptador y el sistema operativo Java, donde la parte que depende de la plataforma se llama adaptador, la JVM se implementa en una plataforma y sistema operativo específicos a través de la interfaz de portabilidad; encima de la JVM está la biblioteca de clases y la biblioteca de extensión de Java Basic y su API, que utiliza la API de Java para escribir aplicaciones y subprogramas. Las aplicaciones y subprogramas de Java escritos utilizando la API de Java se pueden ejecutar en cualquier plataforma Java sin considerar la plataforma subyacente. Esto se debe a que la Máquina Virtual Java (JVM) separa el programa del sistema operativo, logrando así la independencia de la plataforma de Java.
Entonces, ¿qué es exactamente una máquina virtual Java (JVM)? Normalmente, cuando hablamos de JVM, podemos referirnos a:
Una descripción más abstracta de la especificación JVM
Una implementación concreta de la JVM
<; p> Cuando el programa está ejecutando la instancia JVM generada durante el período.La descripción abstracta de la especificación JVM es una colección de conceptos descritos en detalle en el libro "Especificación de máquina virtual Java"; la implementación específica de JVM es software o una combinación de software y hardware; ha sido implementado por múltiples proveedores y coexiste. Disponible en varias plataformas; la tarea de ejecutar programas Java la realiza una única instancia de ejecución de la JVM. Este artículo analiza principalmente la máquina virtual Java (JVM) para el tercer escenario. Puede considerarse como una máquina hipotética, implementada en una computadora real mediante simulación de software, con su propio hardware hipotético (como procesador, pila, registros, etc.) y su correspondiente sistema de instrucciones.
La JVM tiene una misión clara en su ciclo de vida, que es ejecutar programas Java, por lo que cuando se inicia un programa Java, genera una instancia de JVM, cuando finaliza el programa, la instancia desaparece; A continuación, realizaremos un estudio más profundo de la JVM desde dos aspectos: su arquitectura y su proceso de ejecución.
2 Arquitectura de la máquina virtual Java
Como se mencionó anteriormente, JVM puede ser implementada por diferentes proveedores. Los diferentes proveedores inevitablemente generarán algunas diferencias en la implementación de la JVM, pero la JVM aún puede lograr una funcionalidad multiplataforma, gracias al diseño arquitectónico de la JVM.
Sabemos que el comportamiento de una instancia de JVM no es solo asunto suyo, sino que también involucra sus subsistemas, áreas de almacenamiento, tipos de datos e instrucciones, que describen la arquitectura interna abstracta de la JVM. El propósito de esto no es solo especificar la arquitectura interna de la JVM cuando se implementa, sino más importante aún, proporcionar una manera de definir estrictamente el comportamiento externo de la implementación. Cada JVM tiene dos mecanismos, uno para cargar clases (clases o interfaces) con nombres apropiados, llamado subsistema de carga de clases, el otro responsable de ejecutar las instrucciones contenidas en la clase o interfaz cargada, llamado motor de tiempo de ejecución. Cada JVM consta de cinco partes: área de método, montón, pila de Java, contador de programa y pila de método local. Estas partes, junto con el mecanismo de carga de clases y el mecanismo del motor de tiempo de ejecución, forman el siguiente diagrama de arquitectura:
Figura 3 Arquitectura JVM
Cada instancia de JVM tiene sus propias áreas de métodos y Montones, estas áreas son compartidas por todos los subprocesos que se ejecutan dentro de la JVM; estas áreas no se pueden usar cuando la máquina virtual se está ejecutando. ** comparte estas áreas; cuando la máquina virtual carga un archivo de clase, analizará la información de clase contenida en los datos binarios y la colocará en el dominio del método cuando el programa se esté ejecutando, la JVM colocará todos los objetos inicializados por el programa; en el montón; cada uno Cuando se crea un subproceso, tiene su propio contador de programa y pila de Java. El valor en el contador del programa apunta a la siguiente instrucción que se ejecutará, y la pila de Java del subproceso apunta a la siguiente instrucción que se ejecutará. La pila Java del hilo apunta a la siguiente instrucción que se ejecutará. La pila de Java para instrucciones y subprocesos almacena el estado de los métodos Java llamados por ese subproceso; el estado de las llamadas a métodos nativos se almacena en la pila de métodos nativos, según la implementación.
Estos componentes se presentarán por separado a continuación.
El motor de ejecución es el núcleo de la JVM y su comportamiento está determinado por las instrucciones establecidas en la Especificación de la Máquina Virtual Java. Aunque para cada instrucción, la especificación describe con gran detalle lo que debe hacer la implementación de la JVM cuando el código de bytes en ejecución de la JVM encuentra esa instrucción, no dice nada sobre cómo hacerlo. Cada código de bytes realiza una operación básica de la CPU, como agregar un número entero a un registro, transferencia de subrutina, etc. El conjunto de instrucciones de Java es equivalente al lenguaje ensamblador de los programas Java.
El conjunto de instrucciones de Java consta de un operador de un solo byte que especifica la operación a realizar y cero o más operandos que proporcionan los parámetros o datos necesarios para la operación. Muchas instrucciones no tienen operandos y contienen sólo un operador de un solo byte.
El proceso de ejecución del bucle dentro de la máquina virtual es el siguiente:
do{
Obtiene un byte de operador
Según; al operador Operación de ejecución de valor;
}mientras (el programa no finaliza)
La simplicidad del sistema de instrucciones hace que la máquina virtual sea fácil de ejecutar y ayuda a mejorar la eficiencia de la ejecución. Mejorar la eficiencia de ejecución. El número y tamaño de los operandos en una instrucción lo determina el operador. Si el operando tiene más de un byte, se almacena en el orden en que el byte mayor se almacena primero. Por ejemplo, un parámetro de 16 bits se almacena en dos bytes y tiene el valor:
Primer byte * 256 + código del segundo byte.
El flujo de instrucciones generalmente está alineado solo en bytes. Las excepciones son las instrucciones de cambio de tabla y de búsqueda, que requieren que se aplique la alineación en un límite de 4 bytes dentro de la instrucción.
Para la interfaz del método local, la implementación JVM no requiere su soporte, o incluso no lo necesita en absoluto. La interfaz nativa de Java (JNI) implementada por Sun es por consideraciones de portabilidad. Por supuesto, podemos diseñar otras interfaces nativas para reemplazar la JNI de Sun. Pero estos diseños e implementaciones son cosas más complicadas y es necesario asegurarse de que el recolector de basura no libere objetos llamados por métodos locales.
El montón de Java es un área de datos en tiempo de ejecución desde la cual se asigna espacio a instancias (objetos) de clases, y su gestión se maneja mediante la recolección de basura: no le da al programador la capacidad de liberar objetos explícitamente.
JAVA no especifica un algoritmo de recolección de basura específico a usar, y se puede usar una variedad de algoritmos dependiendo de las necesidades del sistema.
Las secciones del método Java son similares al código postcompilado en los lenguajes tradicionales o al cuerpo de párrafo en los procesos Unix. Almacena código de método (código Java compilado) y tabla de símbolos.
En la implementación actual de Java, el código del método no se incluye en el montón de basura recolectada, pero esto está planificado para una versión futura. Cada archivo de clase contiene código compilado para una clase Java o una interfaz Java. Se puede decir que el archivo de clase es el archivo de código de ejecución del lenguaje Java. Para garantizar que los archivos de clase sean independientes de la plataforma, la Especificación de la máquina virtual Java también especifica en detalle el formato del archivo de clase. Para obtener más información, consulte la Especificación de máquina virtual Java de Sun.
Los registros de la máquina virtual Java se utilizan para almacenar el estado de ejecución de la máquina, similar a algunos registros especiales en los microprocesadores: contador de programa Java
optop: apunta hacia la parte superior; del puntero de la pila de operandos;
marco: puntero al entorno de ejecución del método de ejecución actual
marco: puntero al entorno de ejecución del método de ejecución actual
;frame: puntero Un puntero al entorno de ejecución del método que se está ejecutando actualmente.
vars: Puntero a la primera variable en el área de variables locales del método que se está ejecutando actualmente.
En el diagrama de arquitectura anterior, analizamos el primero, el contador de programa. Cada hilo tiene su propio contador de programa después de la creación. Cuando un hilo ejecuta un método Java, contiene la dirección de la instrucción que el hilo está ejecutando. Pero si el hilo ejecuta un método local, entonces el valor del contador del programa no está definido.
La pila de la máquina virtual Java tiene tres áreas: área de variables locales, área del entorno de ejecución y área de operandos.
Área de variables locales
Cada método Java utiliza un conjunto de variables locales de tamaño fijo. Se abordan mediante desplazamientos de palabras en el registro vars. Las variables locales son todas de 32 bits. Los números enteros largos y los números de coma flotante de doble precisión ocupan el espacio de dos variables locales, pero se dirigen al índice de la primera variable local. (Por ejemplo, una variable local de punto flotante de doble precisión en el índice n en realidad ocupa espacio de almacenamiento en los índices n y n+1). La especificación de la máquina virtual no requiere que los valores de 64 bits en las variables locales estén alineados con 64 bits. La máquina virtual proporciona instrucciones para cargar valores de variables locales en la pila de operandos e instrucciones para escribir valores de la pila de operandos en variables locales.
Área del entorno de ejecución
La información contenida en el entorno de ejecución se utiliza para enlaces dinámicos, retornos de métodos normales y captura de excepciones.
Enlace dinámico
El entorno de ejecución incluye punteros a las tablas de símbolos del intérprete para la clase actual y el método actual para admitir el enlace dinámico del código del método. El código del archivo de clase de método utiliza símbolos cuando hace referencia a los métodos que se llamarán y a las variables a las que se accederá. El enlace dinámico convierte llamadas a métodos simbólicos en llamadas a métodos reales, carga las clases necesarias para interpretar símbolos que aún no están definidos y convierte los accesos a variables en direcciones de desplazamiento correspondientes a las estructuras de almacenamiento en tiempo de ejecución para esas variables. Vincular dinámicamente métodos y variables evita que los cambios en otras clases utilizadas en el método afecten el código de este programa.
Retorno de método normal
Si el método actual finaliza normalmente, el método llamado obtendrá el valor de retorno después de ejecutar la instrucción de retorno del tipo correcto. En el caso de un retorno normal, el entorno de ejecución se utiliza para restaurar los registros de la persona que llama e incrementar el contador del programa de la persona que llama en el valor apropiado para omitir las instrucciones de llamada del método ejecutado y luego continuar la ejecución en el entorno de ejecución de la persona que llama.
Captura de excepciones
La excepción se llama Error o Excepción en Java. Es una subclase de la clase Throwable en el programa, se debe a: error de enlace dinámico, como el requerido. No se puede encontrar el archivo de clase. Error de tiempo de ejecución, como desreferenciar un puntero nulo. El programa utiliza la declaración de lanzamiento.
Cuando ocurre una excepción, la Máquina Virtual Java realiza las siguientes acciones:
Comprueba la tabla de cláusulas catch asociada con el método actual. Cada cláusula catch contiene su alcance de instrucción válida, los tipos de excepción que puede manejar y la dirección del bloque de código que maneja la excepción.
Una cláusula de captura que coincide con una excepción debe satisfacer las siguientes condiciones: la instrucción que causó la excepción está dentro del alcance de su instrucción y el tipo de excepción que ocurre es un subtipo del tipo de excepción que puede manejar.
Si se encuentra una cláusula de captura coincidente, el sistema transferirá la ejecución al controlador de excepciones especificado; si no se encuentra ningún controlador de excepciones, el proceso de encontrar cláusulas de captura coincidentes se repetirá hasta que se hayan verificado todas las cláusulas de captura anidadas del método actual.
Debido a que la máquina virtual continúa la ejecución comenzando con la primera cláusula catch coincidente, el orden de las tablas de cláusulas catch es muy importante. Dado que el código Java está estructurado, siempre es posible ordenar todos los controladores de excepciones para un método determinado en una tabla, y para cualquier posible valor de contador del programa, se puede usar un orden lineal para encontrar el bloque de controlador de excepciones apropiado para manejar. Se produjo una excepción. en este valor del contador del programa.
Si no se encuentra una cláusula catch coincidente, entonces el método actual obtiene un resultado de "excepción desbloqueada" y se devuelve a la persona que llama del método actual como si la excepción acabara de ocurrir en su persona que llama. Si aún no se encuentra un controlador de excepciones apropiado en la persona que llama, se propaga un error. Si el error se propaga al nivel superior, se llama al bloque de excepción predeterminado.
El área de la pila de operandos
Las instrucciones de máquina simplemente obtienen los operandos de la pila de operandos, operan sobre ellos y devuelven el resultado a la pila. La razón para elegir una estructura de pila es que puede simular efectivamente el comportamiento de una máquina virtual incluso en máquinas con solo unos pocos registros o registros de propósito no general (como Intel486). La pila de operandos es de 32 bits. Se utiliza para pasar parámetros y recibir resultados de métodos, así como para admitir parámetros para operaciones y almacenar los resultados de las operaciones. Por ejemplo, la instrucción iadd suma dos números enteros. Los dos números enteros que se van a sumar deben ser las dos primeras palabras de la pila de operandos. Estas dos palabras fueron colocadas en la pila mediante la instrucción anterior. Los dos números enteros se extraen de la pila, se suman y el resultado se devuelve a la pila de operandos.
Cada tipo de datos primitivo tiene instrucciones especializadas para realizar las operaciones necesarias sobre él. Cada operando requiere una ubicación de almacenamiento en la pila, excepto los tipos largo y doble, que requieren dos ubicaciones. Los operandos sólo pueden ser operados por operadores aplicables a su tipo. Por ejemplo, es ilegal ingresar dos números de tipo int como números de tipo long. En la implementación de la máquina virtual de Sun, el verificador de código de bytes impone esta restricción. Sin embargo, existen algunas operaciones (operadores dupe e swap) que se pueden utilizar para realizar operaciones en el área de datos en tiempo de ejecución independientemente del tipo.
Pila de métodos locales. Cuando un subproceso llama a un método local, ya no está sujeto a las restricciones de estructura y seguridad de la máquina virtual y puede acceder al área de datos de tiempo de ejecución de la máquina virtual. procesador local así como cualquier tipo de pila. Por ejemplo, si la pila local es la pila C, cuando un programa C llama a una función C, los parámetros de la función se insertan en la pila en un orden determinado y los resultados se devuelven a la función que llama. Al implementar la máquina virtual Java, la interfaz del método local utiliza la pila de modelos de lenguaje C, por lo que la programación y el uso de la pila de métodos locales son exactamente los mismos que los de la pila de lenguaje C.
3 Máquina virtual Java
Lo anterior describe cada parte de la máquina virtual con más detalle. A continuación se utiliza un ejemplo específico para analizar su proceso de ejecución.
La máquina virtual se inicia llamando al método main de la clase especificada, pasando una matriz de cadenas de parámetros a main, provocando que se cargue la clase especificada y vinculando e inicializando otros tipos utilizados por la clase.
Ejemplo de programa:
clase HelloApp
{
public static void main(String[] args)
{
System.out.println("¡Hola mundo!");
for (int i = 0; i < args.length; i++ )
{
System. out.println("¡Hola mundo!");
clase HolaApp
{
public static void main(String[] args)
{
System.out.println("¡Hola mundo!println(args[i]);
}
}
}
}
Una vez completada la compilación, escriba en el modo de línea de comando: java HelloApp ejecutar máquina virtual
Llamando al método principal de HelloApp, los tres Se pasa una serie de cadenas "ejecutar", "virtual" y "máquina" a main y se iniciará la máquina virtual Java. Ahora describiremos los pasos que la máquina virtual puede seguir al ejecutar HelloApp. >
Comience a intentar ejecutar el método principal de la clase HelloApp y se dé cuenta de que la clase no está cargada, es decir, la máquina virtual actualmente no contiene una representación binaria de la clase, la máquina virtual usará el ClassLoader para intentarlo. para encontrar dicha representación binaria, si este proceso falla, se producirá una excepción. Después de cargar la clase, la clase HelloApp debe vincularse con otros tipos antes de llamar al método principal. La vinculación incluye tres etapas: verificación y preparación. y resolución verifica los símbolos de la clase principal cargada. Semántica, se prepara para crear campos estáticos de una clase o interfaz e inicializa estos campos a los valores predeterminados estándar. El análisis es responsable de verificar las referencias simbólicas de la clase principal a otras clases o interfaces. Este paso es opcional. La inicialización de la clase consiste en realizar declaraciones estáticas en la clase. La función de inicialización y el constructor de inicialización del dominio estático deben inicializarse antes de inicializar la clase principal.
Figura 4: El proceso de ejecución de la máquina virtual
4 Conclusión
Este artículo pretende analizar claramente el mecanismo de la máquina virtual Java a través de una investigación en profundidad sobre la arquitectura JVM y un análisis detallado de ella. el proceso de ejecución de la máquina virtual durante la ejecución de programas Java.
publicado @ 2006-07-21 18:14 sunfruit Leer (22) | Comentar (0) | Editar colección
20 de julio de 2006#
[ Original] Ejemplo de registro de consultas para el nuevo controlador de Oracle Spatial
---sunfruit
Se ha actualizado el controlador de operación de la base de datos espacial de Oracle. El nuevo controlador es adecuado para Oracle8.0 y superior. Nuevo El controlador es bastante diferente del controlador original en términos de operación de la base de datos, pero hay una cosa: es relativamente simple de usar
Se omiten los pasos para establecer una base de datos espacial y establecer un índice espacial. Hay muchos ejemplos en Internet. La implementación anterior no ha cambiado.
Declaración de derechos de autorCopyright (c) 2006
*
*
Empresa:
*
* @author sunfruit
* @version 1.0
*/
public class SdoSelect {
public SdoSelect() {
}
public static void main(String[] args) {
String driver = "oracle.jdbc.driver.OracleDriver";
p>String url = "jdbc:oracle:thin:@172.16.75.200:1521:starmap";
String uid = "hmbst";
String psw = " hmbst";
Conexión conn = null;
PreparedStatement ps=null;
prueba {
Class.forName(driver. Controlador Oracle );