Estructura de una Java Virtual Machine (JVM)
1
Estructura de una
Máquina Virtual Java (JVM)
Sesión de laboratorio: VisualJVM
Autor: Pedro Pablo Garrido Abenza
[email protected]
Estructura de una Java Virtual Machine (JVM) 2
1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:
VisualJVM
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
laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 3
1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio: VisualJVM
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.).
Sesión delaboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 4
1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio:
VisualJVM
Lenguajes tradicionales
Hola.c
Hola.c Hola.objHola.obj Hola.exeHola.exe
C API C API Compilación (bcc) Compilación (bcc) Compilación (gcc) Compilación
(gcc) Hola.oHola.o HolaHola
C API C API Enlazado (link) Enlazado (link) Enlazado (ld) Enlazado (ld) Sesión de laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 5 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:
VisualJVM
Java - Una nueva idea
• La tecnología Java es:
– Un lenguaje de programación
– Un conjunto plataformas especializadas
• Java fué diseñado específicamente para ser:
“
Write Once, Run Anywhere”
laboratorio: VisualJVM
J2EE J2SE J2ME
Estructura de una Java Virtual Machine (JVM) 6
1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:
VisualJVM
Java - Una nueva idea
• Esto se consiguió gracias al uso de un
código intermedio:
bytecodes
.
– En tiempo de compilación se generan
bytecodes
independientes de la
plataforma.
– En tiempo de ejecución se ejecutan
(interpretan) los
bytecodes
utilizando un
programa llamado Java Virtual Machine
(JVM) sobre una plataforma específica.
laboratorio:VisualJVM
Estructura de una Java Virtual Machine (JVM) 7
1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio:
VisualJVM
Tecnología Java
Hola.java Hola.java Hola.class bytecodes Hola.class bytecodes Java API Java API
Plataforma
1Plataforma
1Plataforma
Plataforma
22Plataforma
Plataforma
33(Código independiente de la plataforma: .class)
Compilación (javac) Compilación (javac) JVM1 (java) JVM1 (java) JVM(java)2 JVM2 (java) JVM(java)3 JVM3 (java) Sesión de laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 8
1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio:
VisualJVM
Tecnología Java
• Ventajas:
– Multiplataforma
– Código compacto:
bytecodes
– Aplicaciones convencionales y
applets
– Paradigma POO
• Inconvenientes:
– Velocidad de ejecución lenta
Sesión delaboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 9 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:
VisualJVM
Tecnología Java
• Ventajas:
– Multiplataforma
– Código compacto: bytecodes
– Aplicaciones convencionales y applets
– Paradigma POO
• Inconvenientes:
– Velocidad de ejecución lenta
(interpretado)
laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 10
1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:
VisualJVM
Tecnología Java
• Comparando Java con los lenguajes
tradicionales:
laboratorio: VisualJVMHardware
Sistema Operativo
Programas
(código nativo) Lenguajes tradicionalesHardware
Sistema Operativo
Máquina Virtual
(bytecodes => código nativo)
Tecnología Java
Prog. Java
(bytecodes)
Clases Java
(bytecodes)
Estructura de una Java Virtual Machine (JVM) 11
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
¿Por qué estudiar la JVM?
• Comprender aspectos sobre la
portabilidad de los programas Java.
• Distinguir el funcionamiento de un
intérprete frente al de un compilador.
“If you don't understand interpreters, 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.
Sesión delaboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 12
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Implementaciones JVM
• Intérpretes desarrollados:
– Sun Microsystems
– Microsoft, Borland, IBM
– Otros: Kaffe, LaTTe, Kissme, SableVM,
Wonka, ...,
VisualJVM
.
• Todos deben ser compatibles:
–
The Java Virtual Machine Specification
–
Otras especificaciones (JNI, ...).
Sesión de laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 13 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio: VisualJVM
Hardware
Sistema Operativo
JVM - JNI
(awt.dll, net.dll, ...)
JVM
Programas
Java
Librería
clases Java
Java Language Specification
Java API Specification
JVM Specification JNI Specification
La torre de especificaciones
Implementaciones JVM
Estructura de una Java Virtual Machine (JVM) 14
laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Estructura de la JVM
•
Una JVM contiene básicamente:
1. Zona de memoria dinámica (heap)
2. Zona de métodos
3. Hilos de ejecución (threads)
laboratorio: VisualJVM Memoria dinámica (Heap) Hilos (Threads) Zona de métodosEstructura de una Java Virtual Machine (JVM) 15
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Estructura de la JVM – 1/3
1. Zona de memoria dinámica (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.
Sesión de laboratorio: VisualJVM GC Heap Heap Heap Heap Objeto Amarillo eliminado Objeto Amarillo aun vigenteEstructura de una Java Virtual Machine (JVM) 16
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Estructura de la JVM – 2/3
2. 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.
print exit factorial Zona métodos Zona métodos Sesión de laboratorio: VisualJVM
public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return }
public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return }
Estructura de una Java Virtual Machine (JVM) 17 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Estructura de la JVM – 3/3
3. 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 Pointer (FP): puntero que señala al marco de
la cima, el marco actual.
PC SP Program Counter Frame Pointer laboratorio: VisualJVM Marco 0 Hilo (Thread) Hilo (Thread) Stack JVM ID: Marco 1 Marco 2 Marco 3 FP Marco actual main ()
Estructura de una Java Virtual Machine (JVM) 18
laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Estructura de la JVM – 3/3
3.
Elementos de un marco (Frame):
laboratorio:VisualJVM
main (String args[]) { ... } #0. args #1. ... #0. args Marco llamador Método asociado Pila de operandos Vars. locales=2 Args.=1
Puntero al marco que le ha llamado, para retornarle valores.
Puntero al marco que le ha llamado, para retornarle valores.
Código del método, que estará ejecutando la
instrucción indicada por el PC Código del método, que estará ejecutando la
instrucción indicada por el PC
Los opcodes la utilizan para extraer sus parámetros (pop) y dejar los resultados (push).
Los opcodes la utilizan para extraer sus parámetros (pop) y dejar los resultados (push).
Zona para las variables locales; las primeras siempre son los
argumentosrecibidos por el método.
Zona para las variables locales; las primeras siempre son los
argumentosrecibidos por el método.
PC
Estructura de una Java Virtual Machine (JVM) 19
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Invocaciones: args/return
Sesión de laboratorio: VisualJVMFrame 0
(main) PC FP Program Counter Frame Pointer FP Null public static void main(String args[]) { int n=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1 PC
public class P1e {
public static void main (String args[]) { int n = sumaNat (3, 4);
}
private int sumaNat (int ini, int fin) { int i, suma=0;
for (i=ini; i<=fin; i++) { suma+=i; } return (suma);
} }
public class P1e {
public static void main (String args[]) {
int n = sumaNat (3, 4); }
private int sumaNat (int ini, int fin) {
int i, suma=0;
for (i=ini; i<=fin; i++) { suma+=i; }
return (suma); }
}
Estructura de una Java Virtual Machine (JVM) 20
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio: VisualJVM PC FP Program Counter Frame Pointer
Invocaciones: args/return
Frame 0
(main) FP Null public static void main(String args[]) { int n=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1 PC 4 3
Estructura de una Java Virtual Machine (JVM) 21 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Invocaciones: args/return
laboratorio: VisualJVM PC FP Program Counter Frame PointerFrame 0
(main)Frame 1
(sumaNat) FP Nullpublic static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1 PC
private intsumaNat (intini, intfin) {
inti, suma=0;
for(i=ini; i<=fin; i++) { suma+=i; }
return(suma); } Llamador Método asociado #0. ini = 3 #1. fin = 4 #2. i = ? #3. suma = 0 #0. ini = 3 #1. fin = 4 Pila oper. Vars. locales=2 Args.=1 PC 4 3
Estructura de una Java Virtual Machine (JVM) 22
laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Invocaciones: args/return
laboratorio: VisualJVM PC FP Program Counter Frame PointerFrame 0
(main)Frame 1
(sumaNat) FP Nullpublic static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1
private intsumaNat (intini, intfin) {
inti, suma=0;
for(i=ini; i<=fin; i++) { suma+=i; }
return(suma); } Llamador Método asociado #0. ini = 3 #1. fin = 4 #2. i = 5 #3. suma = 7 #0. ini = 3 #1. fin = 4 Pila oper. Vars. locales=2 Args.=1 PC PC 7
Estructura de una Java Virtual Machine (JVM) 23
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Invocaciones: args/return
Sesión de laboratorio: VisualJVM PC FP Program Counter Frame PointerFrame 0
(main)Frame 1
(sumaNat) FP Nullpublic static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1
private intsumaNat (intini, intfin) {
inti, suma=0;
for(i=ini; i<=fin; i++) { suma+=i; }
return(suma); } Llamador Método asociado #0. ini = 3 #1. fin = 4 #2. i = 5 #3. suma = 7 #0. ini = 3 #1. fin = 4 Pila oper. Vars. locales=2 Args.=1 PC PC 7
Estructura de una Java Virtual Machine (JVM) 24
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Invocaciones: args/return
Sesión de laboratorio: VisualJVM PC FP Program Counter Frame Pointer FPFrame 0
(main) Nullpublic static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = 7 #0. args=... Pila oper. Vars. locales=2 Args.=1 PC
Estructura de una Java Virtual Machine (JVM) 25 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Clases - Procesado
• Fases para el procesado de clases Java antes
de su ejecución:
2
3
Carga
Inicio
Enlace
Inicialización
Final
Verificación
Preparación
Resolución
1
2.a
2.b
2.c
laboratorio: VisualJVMEstructura de una Java Virtual Machine (JVM) 26
laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Clases - Fase de carga
• Tareas:
– Búsqueda y carga de clases Java
• Almacenamiento de clases Java:
– Archivos .class empaquetados en los
archivos
.ZIP
o
.JAR
de Java:
C:\Archivos de programa\Java\jdk1.5.0\jre\lib\rt.jar C:\WINDOWS\java\Packages\*.zip
– Archivos
.class
en cualquier directorio
especificado en la variable
CLASSPATH
.
– Archivos .ZIP o .JAR especificados en la
variable
CLASSPATH
.
laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 27
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Clases - Fase de carga
• Los archivos .class son archivos binarios:
Sesión de laboratorio: VisualJVM Número mágico: 0xCAFE BABE Número mágico: 0xCAFE BABE Versión: 0x0000 0031 = 49.0 (J2SDK 1.5.0) Versión: 0x0000 0031 = 49.0 (J2SDK 1.5.0)Estructura de una Java Virtual Machine (JVM) 28
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Clases - Fase de carga
• Estructura de una clase (.class):
–
Número mágico:
0xCAFEBABE
–
Versión Java: 49.0
Î
J2SDK 1.5
–
Visibilidad: pública, privada, etc.
–
Nombre de la superclase
–
Constantpool
: zona de constantes numeradas
(números, nombres de atributos y métodos,
Strings, …), utilizadas por los siguientes.
–
Fields
: lista de campos.
–
Methods
: lista de métodos.
–
Interfaces
: lista de interfaces implementadas.
–
Attributes
: información adicional.
Sesión de laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 29 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Clases - Fase de carga
• Lista de clases cargadas:
– Lista enlazada:
– Tabla Hash de dispersión abierta:
A K D Q NULL 1 2 3 4 5 6 7 0 A Q K D
Función dispersión: Σ(ASCII(nombre)) % cubetas Ejemplo: “A” ⇒(65 % 8) = 1
8
cube ta s NULL NULL NULL NULL NULL NULL NULL NULL laboratorio: VisualJVMEstructura de una Java Virtual Machine (JVM) 30
laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Clases - Fase de enlace
• Se divide en 3 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.
58
186
Perezosa
917
1398
Estática
Microsoft
Sun
Resolución
laboratorio: VisualJVMEstructura de una Java Virtual Machine (JVM) 31
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Clases - Inicialización
• Tareas:
– Ejecución de los constructores 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.
Sesión delaboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 32
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
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)
Sesión delaboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 33 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Repertorio de instrucciones
laboratorio: VisualJVM• La JVM tiene
200
opcodes: 00..FF
• A cada opcode se le asocia una
palabra fácil de recordar:
mnemónico
:
Estructura de una Java Virtual Machine (JVM) 34
laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
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
consta de:
– Un código de operación (opcode): 1 byte
– Seguido de los argumentos (opcionales): 0..5 bytes
laboratorio: VisualJVM
opcode
opcode
[arg1] [arg2] [arg3] [arg4] [arg5]
[arg1] [arg2] [arg3] [arg4] [arg5]
Estructura de una Java Virtual Machine (JVM) 35
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
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.
Sesión de laboratorio: VisualJVM PC SP Program Counter Stack Pointer Null i = ini; iload_0 istore_2 Llamador Método asociado #0. ini=3 #1. fin=4 #2. i = ? #0. ini=3 #1. fin=4 Pila oper. Vars. locales=2 Args.=2 3 iload_0 istore_2 Se compila como ...Estructura de una Java Virtual Machine (JVM) 36
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Repertorio de instrucciones
• Ejemplos - varios:
3 4 SP 3 SP SP 7Apila en la pila de operandos el valor entero 4.
bipush 4 16
(0x10)
Apila en la pila de operandos el valor de la constante nº 4 de la zona de constantes (ConstantPool).
ldc #4 18
(0x12)
Sumar dos enteros. Los pasos son: 1. Extraer operandos de la pila (pop) 2. Realizar la operación (suma) 3. Apilar el resultado en la pila (push)
iadd 096 (0x60)
Finaliza la ejecución del método actual, retornando al método llamador.
return 177 (0xB1) Operación mnemónico opcode Sesión de laboratorio: VisualJVM PC SP Program Counter
Estructura de una Java Virtual Machine (JVM) 37 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Repertorio de instrucciones
• Para obtener el código de un método
de una clase hay varias utilidades:
– javap (Java 2 SDK):
javap -c -verbose HelloWorld
– Jasper (& Jasmin):
java -jar Jasper.jar HelloWorld
– jclasslib Bytecode Viewer
– Class Viewer for Java
– VisualJVM
laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM) 38
laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
VisualJVM
laboratorio: VisualJVMEstructura de una Java Virtual Machine (JVM) 39
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
VisualJVM
Sesión de laboratorio: VisualJVMEstructura de una Java Virtual Machine (JVM) 40
Ejemplo 1
C:\> javap -c –verbose HelloWorld Compiled from HelloWorld.java class HelloWorld extends Object{ HelloWorld();
Code:
0: aload_0 1: invokespecial #1 4: return
public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return }
C:\> javap -c –verbose HelloWorld Compiled from HelloWorld.java class HelloWorld extends Object{ HelloWorld();
Code:
0: aload_0 1: invokespecial #1 4: return
public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return } Constant pool: const # 1 = Method #6.#15; const # 2 = Field #16.#17; const # 3 = String #18; const # 4 = Method #19.#20; const # 5 = class #21; const # 6 = class #22; const # 7 = Asciz <init>; const # 8 = Asciz ()V; const # 9 = Asciz Code;
const #10 = Asciz LineNumberTable; const #11 = Asciz main;
const #12 = Asciz ([Ljava/lang/String;)V; const #13 = Asciz SourceFile;
const #14 = Asciz HelloWorld.java; const #15 = NameAndType #7:#8;
const #16 = class #23; const #17 = NameAndType #24:#25;
const #18 = Asciz Hello World!!; const #19 = class #26;
const #20 = NameAndType #27:#28; const #21 = Asciz HelloWorld; const #22 = Asciz java/lang/Object;
const #23 = Asciz java/lang/System; const #24 = Asciz out;
const #25 = Asciz Ljava/io/PrintStream;;
const #26 = Asciz java/io/PrintStream; const #27 = Asciz println;
const #28 = Asciz (Ljava/lang/String;)V; Constant pool: const # 1 = Method #6.#15; const # 2 = Field #16.#17; const # 3 = String #18; const # 4 = Method #19.#20; const # 5 = class #21; const # 6 = class #22;
const # 7 = Asciz <init>;
const # 8 = Asciz ()V;
const # 9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz main;
const #12 = Asciz ([Ljava/lang/String;)V; const #13 = Asciz SourceFile;
const #14 = Asciz HelloWorld.java; const #15 = NameAndType #7:#8;
const #16 = class #23;
const #17 = NameAndType #24:#25;
const #18 = Asciz Hello World!!;
const #19 = class #26;
const #20 = NameAndType #27:#28; const #21 = Asciz HelloWorld; const #22 = Asciz java/lang/Object;
const #23 = Asciz java/lang/System;
const #24 = Asciz out;
const #25 = Asciz Ljava/io/PrintStream;;
const #26 = Asciz java/io/PrintStream; const #27 = Asciz println;
const #28 = Asciz (Ljava/lang/String;)V;
// HelloWorld.java public class HelloWorld {
public static void main (String args[]) { System.out.println ("Hello World!!"); } } // HelloWorld.java public class HelloWorld {
public static void main (String args[]) { System.out.println
("Hello World!!"); }
Estructura de una Java Virtual Machine (JVM) 41
Ejemplo 2: control de flujo
// Par.java public class Par {
public static void main (String args[]) { boolean b = esPar(6); }
public static boolean esPar (int n) { if ((n % 2) == 0) { return (true); } else { return (false); } } // Par.java public class Par {
public static void main (String args[]) {
boolean b = esPar(6); }
public static boolean esPar (int n) { if ((n % 2) == 0) { return (true); } else { return (false); } } Constant pool: const # 1 = Method #4.#15; const # 2 = Method #3.#16; const # 3 = class #17; const # 4 = class #18; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 7 = Asciz Code;
const # 8 = Asciz LineNumberTable; const # 9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V; const #11 = Asciz esPar;
const #12 = Asciz (I)Z; const #13 = Asciz SourceFile; const #14 = Asciz Par.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #17 = Asciz Par;
const #18 = Asciz java/lang/Object; Constant pool:
const # 1 = Method #4.#15; const # 2 = Method #3.#16;
const # 3 = class #17;
const # 4 = class #18;
const # 5 = Asciz <init>;
const # 6 = Asciz ()V;
const # 7 = Asciz Code;
const # 8 = Asciz LineNumberTable;
const # 9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V;
const #11 = Asciz esPar;
const #12 = Asciz (I)Z;
const #13 = Asciz SourceFile; const #14 = Asciz Par.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12;
const #17 = Asciz Par;
const #18 = Asciz java/lang/Object;
Estructura de una Java Virtual Machine (JVM) 42
Ejemplo 2: control de flujo
C:\> javap -c –verbose Par Compiled from Par.java class Par extends Object{ public Par();
Code:
Stack=1, Locals=1, Args_size=1 0: aload_0
1: invokespecial #1;
// Method java/lang/Object."<init>":()V
4: return
public static void main
(java.lang.String[]); Code:
Stack=1, Locals=2, Args_size=1 0: bipush 6
2: invokestatic #2; // Method esPar:(I)Z 5: istore_1
6: return
C:\> javap -c –verbose Par Compiled from Par.java class Par extends Object{
public Par(); Code:
Stack=1, Locals=1, Args_size=1 0: aload_0
1: invokespecial #1;
// Method java/lang/Object."<init>":()V
4: return
public static void main
(java.lang.String[]); Code:
Stack=1, Locals=2, Args_size=1 0: bipush 6
2: invokestatic #2;
// Method esPar:(I)Z
5: istore_1 6: return
public static boolean esPar(int); Code: Stack=2,Locals=1,Args_size=1 0: iload_0 1: iconst_2 2: irem 3: ifne 8 6: iconst_1 7: ireturn 8: iconst_0 9: ireturn}
public static boolean esPar(int); Code: Stack=2,Locals=1,Args_size=1 0: iload_0 1: iconst_2 2: irem 3: ifne 8 6: iconst_1 7: ireturn 8: iconst_0 9: ireturn}
Estructura de una Java Virtual Machine (JVM) 43
Ejemplo 3: factorial iterativo
// FactIter.java public class FactIter {
public static void main (String args[]) { int n = fact(3); }
public static int fact(int n) { int res; for (res=1; (n>=1); n--) { res *= n; } return (res); } } // FactIter.java public class FactIter {
public static void main (String args[]) { int n = fact(3); }
public static int fact(int n) {
int res; for (res=1; (n>=1); n--) { res *= n; } return (res); } } Constant pool: const # 1 = Method #4.#15; const # 2 = Method #3.#16; const # 3 = class #17; const # 4 = class #18; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 7 = Asciz Code;
const # 8 = Asciz LineNumberTable; const # 9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V;
const #11 = Asciz fact; const #12 = Asciz (I)I;
const #13 = Asciz SourceFile; const #14 = Asciz FactIter.java; const #15 = NameAndType #5:#6;
const #16 = NameAndType #11:#12; const #17 = Asciz FactIter;
const #18 = Asciz java/lang/Object; Constant pool:
const # 1 = Method #4.#15; const # 2 = Method #3.#16;
const # 3 = class #17;
const # 4 = class #18;
const # 5 = Asciz <init>;
const # 6 = Asciz ()V;
const # 7 = Asciz Code;
const # 8 = Asciz LineNumberTable;
const # 9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V;
const #11 = Asciz fact; const #12 = Asciz (I)I;
const #13 = Asciz SourceFile; const #14 = Asciz FactIter.java; const #15 = NameAndType #5:#6;
const #16 = NameAndType #11:#12;
const #17 = Asciz FactIter;
const #18 = Asciz java/lang/Object;
Estructura de una Java Virtual Machine (JVM) 44
Ejemplo 3: factorial iterativo
C:\> javap -c –verbose FactIter Compiled from FactIter.java class FactIter extends Object{ public FactIter();
Code:
Stack=1, Locals=1, Args_size=1 0: aload_0
1: invokespecial #1;
// Method java/lang/Object."<init>":()V
4: return
public static void main (java.lang.String[]); Code:
Stack=1, Locals=2, Args_size=1 0: iconst_3
1: invokestatic #2;
// Method fact:(I)I
4: istore_1 5: return
C:\> javap -c –verbose FactIter Compiled from FactIter.java class FactIter extends Object{
public FactIter(); Code:
Stack=1, Locals=1, Args_size=1 0: aload_0
1: invokespecial #1;
// Method java/lang/Object."<init>":()V
4: return
public static void main (java.lang.String[]); Code:
Stack=1, Locals=2, Args_size=1 0: iconst_3
1: invokestatic #2;
// Method fact:(I)I
4: istore_1 5: return
public static int fact (int); Code: Stack=2,Locals=2,Args_size=1 0: iconst_1 1: istore_1 2: iload_0 3: iconst_1 4: if_icmplt 17 7: iload_1 8: iload_0 9: imul 10: istore_1 11: iinc 0, -1 14: goto 2 17: iload_1 18: ireturn }
public static int fact (int); Code: Stack=2,Locals=2,Args_size=1 0: iconst_1 1: istore_1 2: iload_0 3: iconst_1 4: if_icmplt 17 7: iload_1 8: iload_0 9: imul 10: istore_1 11: iinc 0, -1 14: goto 2 17: iload_1 18: ireturn }
Estructura de una Java Virtual Machine (JVM) 45
Ejemplo 4: factorial recursivo
// FactRecu.java public class FactRecu {
public static void main (String args[]) { int n = fact(6); }
public static int fact(int n) { if (n==1) { return (1); } else { return (n*fact(n-1)); } } } // FactRecu.java public class FactRecu {
public static void main (String args[]) { int n = fact(6); }
public static int fact(intn) {
if (n==1) { return (1); } else { return (n*fact(n-1)); } } } Constant pool: const # 1 = Method #4.#15; const # 2 = Method #3.#16; const # 3 = class #17; const # 4 = class #18; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 7 = Asciz Code;
const # 8 = Asciz LineNumberTable; const # 9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V; const #11 = Asciz fact;
const #12 = Asciz (I)I; const #13 = Asciz SourceFile; const #14 = Asciz FactRecu.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #17 = Asciz FactRecu; const #18 = Asciz java/lang/Object; Constant pool:
const # 1 = Method #4.#15; const # 2 = Method #3.#16;
const # 3 = class #17;
const # 4 = class #18;
const # 5 = Asciz <init>;
const # 6 = Asciz ()V;
const # 7 = Asciz Code;
const # 8 = Asciz LineNumberTable;
const # 9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V;
const #11 = Asciz fact;
const #12 = Asciz (I)I;
const #13 = Asciz SourceFile; const #14 = Asciz FactRecu.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #17 = Asciz FactRecu; const #18 = Asciz java/lang/Object;
Estructura de una Java Virtual Machine (JVM) 46
Ejemplo 4: factorial recursivo
C:\> javap -c –verbose FactRecu Compiled from FactRecu.java class FactRecu extends Object{ public FactRecu();
Code:
Stack=1, Locals=1, Args_size=1 0: aload_0
1: invokespecial #1;
// Method java/lang/Object."<init>":()V
4: return
public static void main (java.lang.String[]); Code:
Stack=1, Locals=2, Args_size=1 0: bipush 6
2: invokestatic #2; // Method fact:(I)I 5: istore_1
6: return
C:\> javap -c –verbose FactRecu Compiled from FactRecu.java class FactRecu extends Object{
public FactRecu(); Code:
Stack=1, Locals=1, Args_size=1 0: aload_0
1: invokespecial #1;
// Method java/lang/Object."<init>":()V
4: return
public static void main (java.lang.String[]); Code:
Stack=1, Locals=2, Args_size=1
0: bipush 6
2: invokestatic #2;
// Method fact:(I)I
5: istore_1 6: return
public static int fact(int); Code: Stack=3,Locals=1,Args_size=1 0: iload_0 1: iconst_1 2: if_icmpne 7 5: iconst_1 6: ireturn 7: iload_0 8: iload_0 9: iconst_1 10: isub 11: invokestatic #2; // Method fact:(I)I 14: imul 15: ireturn }
public static int fact(int); Code: Stack=3,Locals=1,Args_size=1 0: iload_0 1: iconst_1 2: if_icmpne 7 5: iconst_1 6: ireturn 7: iload_0 8: iload_0 9: iconst_1 10: isub 11: invokestatic #2; // Method fact:(I)I 14: imul 15: ireturn }
Estructura de una Java Virtual Machine (JVM) 47
Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes
Bibliografía y enlaces
•
The Java API documentation
• Tim Lindholm, Frank Yellin,
The JVM
Specification
, Second Edition, Addison
Wesley, Java Series, April 1999.
• D. Friedman, M. Wand, and C. Haynes,
Essentials of Programming Languages
, 2nd
ed. MIT Press, 2001.
• Bill Blunden, Virtual Machine Design and
Implementation in C/C++, Wordware
Publishing, March 2002
•
JVM Instruction Reference
(Quick refer.).
Sesión de laboratorio: VisualJVM
Estructura de una Java Virtual Machine (JVM)
48