Estructura de una Máquina Virtual Java (JVM) Autor: Pedro Pablo Garrido Abenza pgarrido@umh.es Proceso de programación Primero se escribe el programa en un lenguaje de alto nivel (código fuente). Este código se traduce a instrucciones que una máquina específica puede ejecutar (código ejecutable). Para ello se han inventado varias estrategias: Ensambladores (ASM Código nativo) Compiladores (SRC Código nativo) Intérpretes Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Problema Durante mucho tiempo un problema común ha sido la necesidad de poder ejecutar un mismo programa en diferentes plataformas (sistemas operativos, hardware, etc.). Hola.c Hola.c Lenguajes tradicionales Compilación Compilación (bcc) (bcc) Hola.obj Hola.obj Enlazado Enlazado (link) (link) C API API Hola.exe Hola.exe Compilación Compilación (gcc) (gcc) Hola.o Hola.o Enlazado Enlazado (ld) (ld) Hola Hola C API API Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
Java - Una nueva idea La tecnología Java es: Un lenguaje de programación Un conjunto plataformas especializadas JEE JSE JME Java - Una nueva idea Esto se consiguió gracias al uso de un código ermedio: bytecodes. En tiempo de compilación se generan bytecodes independientes de la plataforma. Java fué diseñado específicamente para ser: Write Once, Run Anywhere En tiempo de ejecución se ejecutan (erpretan) los bytecodes utilizando un programa llamado Java Virtual Machine (JVM) sobre una plataforma específica. Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Java Java API API Tecnología Java Hola.java Hola.java JVM JVM (java) (java) Compilación (javac) (javac) Hola. Hola. bytecodes bytecodes (Código independiente de la plataforma:.) JVM JVM (java) (java) JVM JVM (java) (java) Tecnología Java Ventajas: Multiplataforma Código compacto: bytecodes Aplicaciones convencionales y applets Paradigma POO Inconvenientes: Velocidad de ejecución lenta Plataforma Plataforma Plataforma Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
Tecnología Java Ventajas: Multiplataforma Código compacto: bytecodes Aplicaciones convencionales y applets Paradigma POO Inconvenientes: Velocidad de ejecución lenta (erpretado) Tecnología Java Comparando Java con los lenguajes tradicionales: Programas (código nativo) Sistema Operativo Hardware Lenguajes tradicionales Prog. Java (bytecodes) Máquina Virtual (bytecodes > código nativo) Sistema Operativo Hardware Tecnología Java Clases Java (bytecodes) Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) 0 Por qué estudiar la JVM? Comprender aspectos sobre la portabilidad de los programas Java. Distinguir el funcionamiento de un érprete frente al de un compilador. If you don't understand erpreters, you can still write programs; you can even be a competent programmer. But you can't be a master (Friedman). Implementar nuestra propia JVM. Analizar la salida de los compiladores Java para optimizarlos. Implementaciones JVM Intérpretes desarrollados: Sun Microsystems Microsoft, Borland, IBM Otros: Kaffe, LaTTe, Kissme, SableVM, Wonka,...,. Todos deben ser compatibles: The Java Virtual Machine Specification Otras especificaciones (JNI,...). Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
Implementaciones JVM Programas Java JVM Librería clases Java JVM - JNI (awt.dll, net.dll,...) Java Language Specification Java API Specification JVM Specification JNI Specification Estructura de la JVM Una JVM contiene básicamente:. Zona de memoria dinámica (heap). Zona de métodos. Hilos de ejecución (threads) Memoria dinámica (Heap) Sistema Operativo Hardware Zona de métodos Hilos (Threads) La torre de especificaciones Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Objeto Amarillo aun vigente Objeto Amarillo eliminado Estructura de la JVM /. Zona de memoria dinámica (heap): Heap Heap Es una zona de memoria reservada por la JVM para almacenar las instancias de las clases (objetos) que se crean. Periódicamente se ejecuta el algoritmo de Garbage Collection (GC) para liberar memoria ocupada por objetos eliminados, y compactar huecos libres. GC Heap Heap Estructura de la JVM /. Zona de métodos: Es una zona de memoria utilizada para almacenar el código de los métodos de todas las clases Java cargadas (bytecodes). Zona compartida por todos los hilos. Zona Zona métodos métodos factorial pr exit get get ; ; : : ldc ldc ; ; : : invokevirtual invokevirtual ; ; : : Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
SP Frame Poer Estructura de la JVM /. Hilos de ejecución (threads): Sólo uno estará activo en un instante. Cada hilo contiene: ID: un identificador único. Stack JVM: pila de llamadas a métodos Cada elemento de la pila es un marco (Frame). Frame Poer (): puntero que señala al marco de Hilo Hilo (Thread) (Thread) ID: la cima, el marco actual. Marco Marco Marco Marco 0 Stack JVM Marco actual () Estructura de una Java Virtual Machine (JVM) Estructura de la JVM /. Elementos de un marco (Frame): Zona Zona para para las las variables locales; locales; las las primeras siempre siempre son son los los argumentos recibidos por por el el método. método. Args. Vars. locales 0. args 0. args....... Código Código del del método, que que estará estará ejecutando la la instrucción indicada por por el el Los Los opcodes opcodesla la utilizan utilizan para para extraer extraer sus sus parámetros (pop) (pop) y dejar dejar los los resultados (push). (push). Pila de operandos Marco llamador Puntero Puntero al al marco marco que que le le ha ha llamado, para para retornarle valores. valores. Estructura de una Java Virtual Machine (JVM) Invocaciones: args/ Pe Pe n n sumanat sumanat (, (, ); ); private private sumanat sumanat ( ( ini, ini, fin) fin) i, i, suma0; suma0; for for (iini; (iini; i<fin; i<fin; i++) i++) suma+i; suma+i; (suma); (suma); Invocaciones: args/ Frame Poer Frame 0 () Args. Vars. locales 0. args... 0. args.... n? nsumanat(,); Null Frame Poer Frame 0 () Args. Vars. locales 0. args... 0. args.... n? nsumanat(,); Null Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) 0
Invocaciones: args/ Args. 0. ini. fin Vars. locales 0. ini. fin. i?. suma 0 private sumanat ( ini, fin) i, suma0; for (iini; i<fin; i++) suma+i; (suma); Invocaciones: args/ Args. 0. ini. fin Vars. locales 0. ini. fin. i. suma private sumanat ( ini, fin) i, suma0; for (iini; i<fin; i++) suma+i; (suma); Frame Poer Frame (sumanat) Frame 0 () Args. Vars. locales 0. args... 0. args.... n? nsumanat(,); Null Frame Poer Frame (sumanat) Frame 0 () Args. Vars. locales 0. args... 0. args.... n? nsumanat(,); Null Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Invocaciones: args/ Args. 0. ini. fin Vars. locales 0. ini. fin. i. suma private sumanat ( ini, fin) i, suma0; for (iini; i<fin; i++) suma+i; (suma); Invocaciones: args/ Frame Poer Frame (sumanat) Args. Vars. locales 0. args... 0. args.... n? Frame 0 () Null nsumanat(,); Estructura de una Java Virtual Machine (JVM) Frame Poer Frame 0 () Args. 0. args... Vars. locales 0. args.... n Null nsumanat(,); Estructura de una Java Virtual Machine (JVM)
Clases - Procesado Fases para el procesado de clases Java antes de su ejecución: Carga Enlace.a.b.c Verificación Preparación Resolución Inicialización Tareas: Clases - Fase de carga Búsqueda y carga de clases Java Almacenamiento de clases Java: Archivos. empaquetados en los archivos.zip o.jar de Java: C:\Archivos de programa\java\jdk..0\jre\lib\rt.jar C:\WINDOWS\java\Packages\*.zip Archivos. en cualquier directorio especificado en la variable CLASSPATH. Archivos.ZIP o.jar especificados en la variable CLASSPATH. Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Número mágico: 0xCAFE BABE Versión: 0x0000 00 00.0.0 (JSDK..0) Clases - Fase de carga Los archivos. son archivos binarios: Clases - Fase de carga Estructura de una clase (.): Número mágico: 0xCAFEBABE Versión Java:.0 JSDK. Visibilidad: pública, privada, etc. Nombre de la superclase zona de antes numeradas (números, nombres de atributos y métodos, Strings, ), utilizadas por los siguientes. Fields: lista de campos. s: lista de métodos. Interfaces: lista de erfaces implementadas. Attributes: información adicional. Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
Clases - Fase de carga Lista de clases cargadas: cubetas Lista enlazada: A K Tabla Hash de dispersión abierta: 0 D A K D Q Q Función dispersión: Σ (ASCII(nombre)) % cubetas Ejemplo: A ( % ) Clases - Fase de enlace Se divide en subfases: Verificación: formato correcto Preparación: creación de datos de clase Resolución de referencias simbólicas: Estática: se resuelven todas al principio (de forma recursiva). Perezosa: se resuelven sólo cuando son realmente utilizadas. Resolución Estática Perezosa Sun Microsoft Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) 0 Tareas: Clases - Inicialización Ejecución de los ructores de clase (Métodos <clinit>). Una vez procesada una clase completamente, ya será posible... Crear instancias de esa clase. Ejecutar los métodos que incluye. Repertorio de instrucciones Cada MV tiene su propio juego de instrucciones, al igual que cualquier CPU. Tradicionalmente hay dos tipos de juegos de instrucciones: Basados en pila: las instrucciones toman los operandos de la pila de operandos Máquinas Virtuales (más sencillo). Basados en registros: los operandos se toman de unos "registros" CPUs. La JVM está basada en pila (CISC) Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
Repertorio de instrucciones La JVM tiene 00 opcodes: 00..FF A cada opcode se le asocia una palabra fácil de recordar: mnemónico: Repertorio de instrucciones Los opcodes se pueden agrupar por categorías: Carga y almacenamiento (Load & Store), Operaciones aritméticas, Conversiones de tipo, Creación y gestión de objetos, Gestión de pila de operandos, Control de flujo de ejecución, Invocación a métodos y retorno. Código de los métodos: bytecodes. Un bytecode a de: Un código de operación (opcode): byte Seguido de los argumentos (opcionales): 0.. bytes opcode [arg] [arg] [arg] [arg] [arg] Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) SP Stack Poer Repertorio de instrucciones Ejemplos Load y Store: La familia LOAD apila el valor de una variable local en la cima de la pila de operandos. La familia STORE desapila el valor de la cima de la pila y lo almacena en una variable local. Args. 0. ini. fin i ini; Se compila como... Vars. locales 0. ini iload_0. fin istore_. i? iload_0 istore_ Null SP Stack Poer Repertorio de instrucciones Ejemplos - varios: opcode (0xB) (0x0) (0x) 0 (0x0) mnemónico bipush ldc iadd Pila de operandos Operación iza la ejecución del método actual, retornando al método llamador. Apila en la pila de operandos el valor entero. Apila en la pila de operandos el valor de la ante nº de la zona de antes (Pool). Sumar dos enteros. Los pasos son:. Extraer operandos de la pila (pop). Realizar la operación (suma). Apilar el resultado en la pila (push) SP SP SP Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
Repertorio de instrucciones Para obtener el código de un método de una clase hay varias utilidades: javap (Java SDK): javap -c -verbose HelloWorld Jasper (& Jasmin): java -jar Jasper.jar HelloWorld jlib Bytecode Viewer Class Viewer for Java Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Ejemplo HelloWorld.java HelloWorld.java HelloWorld HelloWorld System.out.prln System.out.prln ("Hello ("Hello World!!"); World!!"); C:\> javap -c verbose HelloWorld C:\> javap -c verbose HelloWorld Compiled from HelloWorld.java Compiled from HelloWorld.java HelloWorld extends Object HelloWorld extends Object HelloWorld(); HelloWorld(); aload_0 aload_0 : invokespecial : invokespecial : : get ; get ; : ldc ; : ldc ; : invokevirtual ; : invokevirtual ; : :.;.; Field Field.;.; String String ; ;.0;.0; ; ; ; ; 0 0 ; ; HelloWorld.java; HelloWorld.java; :; :; ; ; :; :; Hello Hello World!!; World!!; ; ; 0 0 :; :; HelloWorld; HelloWorld; java/lang/system; java/lang/system; out; out; Ljava/io/PrStream;; Ljava/io/PrStream;; java/io/prstream; java/io/prstream; prln; prln; (Ljava/lang/String;)V; (Ljava/lang/String;)V; Estructura de una Java Virtual Machine (JVM) 0
Ejemplo : control de flujo Par.java Par.java.;.; Par Par.;.; ; ; ; ; boolean boolean b b espar(); espar(); boolean boolean espar espar ; ; ( ( n) n) 0 0 if if ((n ((n % % ) ) 0) 0) espar; espar; (true); (true); (I)Z; (I)Z; else else (false); (false); Par.java; Par.java; :; :; :; :; Par; Par; Ejemplo : control de flujo C:\> C:\> javap javap -c -c verbose verbose Par Par Compiled Compiled from from Par.java boolean boolean espar(); espar(); Par.java Par Par extends extends Object Object Stack,Locals,Args_size Stack,Locals,Args_size Par(); Par(); iload_0 iload_0 : Stack, Stack, Locals, Locals, Args_size : i_ i_ Args_size aload_0 : aload_0 : irem irem : : invokespecial invokespecial ; ; : : ifne ifne java/lang/object."<init>":()v java/lang/object."<init>":()v : : : : i_ i_ : : i i : : i_0 i_0 : : i i Stack, Stack, Locals, Locals, Args_size Args_size bipush bipush : : invoke invoke ; ; espar:(i)z espar:(i)z : : istore_ istore_ : : Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM) Ejemplo : factorial iterativo FactIter.java FactIter.java.;.; FactIter FactIter.;.; ; ; ; ; n n fact(); fact(); fact( fact( n) n) res; res; for for (res; (res; (n>); (n>); n--) n--) ; ; res res * * n; n; 0 0 fact; fact; (res); (res); (I)I; (I)I; FactIter.java; FactIter.java; :; :; :; :; FactIter; FactIter; Ejemplo : factorial iterativo C:\> C:\> javap javap -c -c verbose verbose FactIter FactIter Compiled Compiled from from FactIter.java fact fact (); (); FactIter.java FactIter FactIter extends extends Object Object Stack,Locals,Args_size FactIter(); FactIter(); i_ i_ : : istore_ istore_ Stack, Stack, Locals, Locals, Args_size Args_size : : iload_0 iload_0 aload_0 aload_0 : : i_ i_ : : invokespecial invokespecial ; ; : java/lang/object."<init>":()v : if_icmplt if_icmplt java/lang/object."<init>":()v : : : : iload_ iload_ : : iload_0 iload_0 : : imul imul istore_ istore_ : : iinc iinc 0, 0, - - Stack, Stack, Locals, Locals, Args_size Args_size : : goto goto i_ i_ : : : invoke invoke ; : iload_ iload_ ; : fact:(i)i : i i fact:(i)i : : istore_ istore_ : : Estructura de una Java Virtual Machine (JVM) Estructura de una Java Virtual Machine (JVM)
Ejemplo : factorial recursivo FactRecu.java FactRecu.java.;.; FactRecu FactRecu.;.; ; ; ; ; n n fact(); fact(); fact( fact( n) n) if if (n) (n) (); (); ; ; else else 0 0 (n*fact(n-)); (n*fact(n-)); fact; fact; (I)I; (I)I; FactRecu.java; FactRecu.java; :; :; :; :; FactRecu; FactRecu; Estructura de una Java Virtual Machine (JVM) Ejemplo : factorial recursivo C:\> C:\> javap javap -c -c verbose verbose FactRecu FactRecu Compiled Compiled from from FactRecu.java FactRecu.java fact(); fact(); FactRecu FactRecu extends extends Object Object Stack,Locals,Args_size FactRecu(); FactRecu(); iload_0 iload_0 Stack, Stack, Locals, Locals, Args_size Args_size : : i_ i_ aload_0 aload_0 : : : invokespecial invokespecial ; : if_icmpne if_icmpne ; java/lang/object."<init>":()v java/lang/object."<init>":()v : : i_ i_ : : : : i i : : iload_0 iload_0 : : iload_0 iload_0 Stack, Stack, Locals, Locals, Args_size : Args_size : i_ i_ bipush bipush isub isub : : invoke invoke ; ; : fact:(i)i : invoke invoke ; ; fact:(i)i : : istore_ istore_ fact:(i)i fact:(i)i : : : : imul imul : : i i Estructura de una Java Virtual Machine (JVM) Bibliografía y enlaces The Java API documentation Tim Lindholm, Frank Yellin, The JVM Specification, Second Edition, Addison Wesley, Java Series, April. D. Friedman, M. Wand, and C. Haynes, Essentials of Programming Languages, nd ed. MIT Press, 00. Bill Blunden, Virtual Machine Design and Implementation in C/C++, Wordware Publishing, March 00 JVM Instruction Reference (Quick refer.). Estructura de una Java Virtual Machine (JVM) Estructura de una Máquina Virtual Java (JVM) Autor: Pedro Pablo Garrido Abenza pgarrido@umh.es Estructura de una Java Virtual Machine (JVM)